Come eseguire awk per un certo numero di righe.?


18

Voglio estrarre alcune righe con awk. È possibile svolgere la seguente attività:

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

Come posso visualizzare i dettagli dai numeri di riga da 122 a 129?


Se dovessi farlo in un ciclo, suggerirei il sedmetodo, poiché sedè molto più piccolo (e carica più velocemente) di awk.
zrajm,

Risposte:


36

Non hai capito come awkfunziona. Il "programma" specificato viene sempre eseguito una volta per ogni riga (o "record" in awk parlance) di input, non è necessario FORo alcun costrutto simile. Usa solo:

metodo dettagliato

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

metodo più compatto

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

Questo dà un intervallo per NR, che è il "Record numerico", in genere questa è la riga correnteawk elaborazione.


6
In realtà il awkcodice tipico per tale attività è di solito ls -l | awk 'NR==122,NR==129'.
arte

qual è il comando per ottenere le ultime 100 righe dal file usando awk
Shihabudheen KM

8

Un altro metodo alternativo sarebbe quello di utilizzare sed:

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

Ma se, come suggerisce la tua domanda, è importante usare awk per questo, segui il commento di Manatwork sulla risposta di Zrajm. Come afferma la documentazione di awk:

   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.

Quindi, se vuoi, puoi anche creare condizioni più avanzate. Per esempio:

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

Ciò darebbe inizio all'output alla riga 122 e continuerebbe fino a quando una riga conteneva la parola "foobar".

Se ci comunichi il caso d'uso effettivo , potremmo essere in grado di aiutarti con le risposte che forniscono una soluzione migliore. Sono preoccupato che questo sembri un problema XY .


2

Un altro modo di farlo (anche se preferisco il awkmetodo) usando coreutils:

ls -l | tail -n +122 | head -n 8
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.