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?
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?
Risposte:
Non hai capito come awk
funziona. Il "programma" specificato viene sempre eseguito una volta per ogni riga (o "record" in awk parlance) di input, non è necessario FOR
o 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.
awk
codice tipico per tale attività è di solito ls -l | awk 'NR==122,NR==129'
.
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 .
sed
metodo, poichésed
è molto più piccolo (e carica più velocemente) diawk
.