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

18

Eu quero extrair algumas linhas com awk. É possível executar 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?

cooldharma06
fonte
Se você fizer isso em um loop, sugiro o sedmétodo, pois sedé muito menor (e carrega mais rápido) do que awk.
Zrajm 6/09/13

Respostas:

36

Você não entendeu como awkfunciona. O "programa" especificado é sempre executado uma vez para cada linha (ou "registro" na linguagem awk) de entrada, não há necessidade FORou construção semelhante. 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 fornece um intervalo para NR, que é o "Registro de número", normalmente é a linha atual que awkestá sendo processada.

zrajm
fonte
6
Na verdade, o awkcódigo típico para essa tarefa é geralmente ls -l | awk 'NR==122,NR==129'.
manatwork
Qual é o comando para obter passado 100 linha do arquivo usando awk
Shihabudheen KM
8

Um outro método alternativo seria usar sed:

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

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

   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 você quiser, também poderá 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 o caso de uso real , poderemos ajudar com respostas que fornecem uma solução melhor. Estou preocupado que isso pareça um problema XY .

ghoti
fonte
2

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

ls -l | tail -n +122 | head -n 8
terdon
fonte