Como executar o awk para um certo número de linhas?

12

Eu quero extrair algumas linhas com awk . É possível fazer a seguinte tarefa:

ls -l | awk 'BEGIN FOR(i=122;i<=129;i++) FNR==i'

Como posso exibir os detalhes dos números de linha 122 a 129?

    
por cooldharma06 06.09.2013 / 10:53

3 respostas

28

Você não entendeu como awk funciona. O "programa" especificado é sempre executado uma vez para cada linha (ou "registro" no jargão do awk) de entrada, não há necessidade de FOR ou qualquer construção similar. Apenas use:

método detalhado

ls -l | awk 'NR>=122 && NR<=129 { print }'

método mais compacto

ls -l | awk 'NR==122,NR==129'

Esse um dá um intervalo para NR , que é o "Registro de Número", normalmente essa é a linha atual que o awk está processando.

    
por 06.09.2013 / 11:04
6

Mais um método alternativo seria usar sed :

ls -l | sed -ne '122,129p'

Mas se, como sua pergunta sugere, é importante usar o awk para isso, vá com o comentário do manatwork sobre a resposta de Zrajm. Como a documentação do awk declara:

   A  pattern  may  consist  of two patterns separated by a comma; in this
   case, the action is performed for all lines from an occurrence  of  the
   first pattern though an occurrence of the second.

Então, se quiser, você também pode criar condições mais avançadas. Por exemplo:

ls -l | awk 'NR==122,/foobar/'

Isso iniciaria a saída na linha 122 e continuaria até que uma linha contivesse a palavra "foobar".

Se você nos informar sobre o caso de uso real , poderemos ajudar com respostas que forneçam uma solução melhor. Estou preocupado que isso soe como um problema XY .

    
por 06.09.2013 / 20:18
2

Outra maneira de fazer isso (embora eu prefira o método awk ) usando coreutils:

ls -l | tail -n +122 | head -n 8
    
por 06.09.2013 / 19:14

Tags