Si tuviera que hacer esto en un bucle, sugeriría el sedmétodo, ya que sedes mucho más pequeño (y se carga más rápido) que awk.
zrajm
Respuestas:
36
No has entendido cómo awkfunciona. El "programa" especificado siempre se ejecuta una vez para cada línea (o "registro" en un lenguaje awk) de entrada, no hay necesidad de FORninguna construcción similar. Solo usa:
método detallado
ls -l | awk 'NR>=122 && NR<=129 { print }'
método más compacto
ls -l | awk 'NR==122,NR==129'
Este da un rango para NR, que es el "Registro de números", típicamente esta es la línea actual que se awkestá procesando.
En realidad, el awkcódigo típico para dicha tarea suele ser ls -l | awk 'NR==122,NR==129'.
manatwork
cuál es el comando para obtener las últimas 100 líneas del archivo usando awk
Shihabudheen KM
8
Un método alternativo más sería usar sed:
ls -l | sed -ne '122,129p'
Pero si, como sugiere su pregunta, es importante usar awk para esto, vaya con el comentario de manatwork sobre la respuesta de Zrajm. Como dice la documentación de awk:
A pattern may consist of two patterns separated by a comma; in thiscase, the action is performed for all lines from an occurrence of the
first pattern though an occurrence of the second.
Entonces, si lo desea, también puede hacer condiciones más avanzadas. Por ejemplo:
ls -l | awk 'NR==122,/foobar/'
Esto comenzaría la salida en la línea 122 y continuaría hasta que una línea contenga la palabra "foobar".
Si nos cuenta el caso de uso real , podríamos ayudarlo con respuestas que brinden una mejor solución. Me preocupa que esto parezca un problema XY .
sed
método, ya quesed
es mucho más pequeño (y se carga más rápido) queawk
.Respuestas:
No has entendido cómo
awk
funciona. El "programa" especificado siempre se ejecuta una vez para cada línea (o "registro" en un lenguaje awk) de entrada, no hay necesidad deFOR
ninguna construcción similar. Solo usa:método detallado
método más compacto
Este da un rango para
NR
, que es el "Registro de números", típicamente esta es la línea actual que seawk
está procesando.fuente
awk
código típico para dicha tarea suele serls -l | awk 'NR==122,NR==129'
.Un método alternativo más sería usar
sed
:Pero si, como sugiere su pregunta, es importante usar awk para esto, vaya con el comentario de manatwork sobre la respuesta de Zrajm. Como dice la documentación de awk:
Entonces, si lo desea, también puede hacer condiciones más avanzadas. Por ejemplo:
Esto comenzaría la salida en la línea 122 y continuaría hasta que una línea contenga la palabra "foobar".
Si nos cuenta el caso de uso real , podríamos ayudarlo con respuestas que brinden una mejor solución. Me preocupa que esto parezca un problema XY .
fuente
Otra forma de hacerlo (aunque prefiero el
awk
método) usando coreutils:fuente