separador print linea leer fichero examples campos shell unix awk

shell - print - awk unix



Cómo imprimir 5 líneas consecutivas después de un patrón en el archivo usando awk (7)

Me gustaría buscar un patrón en un archivo e imprimir 5 líneas después de encontrar ese patrón. Necesito usar awk para hacer esto.

Ejemplo: contenido del archivo:

. . . . ####PATTERN####### #Line1 #Line2 #Line3 #Line4 #Line5 . . .

¿Cómo analizo un archivo e imprimo solo las líneas mencionadas anteriormente? ¿Utilizo el NR de la línea que contiene "PATRÓN" y sigo incrementando hasta 5 e imprimo cada línea en el proceso? Por favor, avíseme si hay otro wat eficiente para hacerlo en Awk.


Otra forma de hacerlo en AWK:

awk ''/PATTERN/ {for(i=1; i<=5; i++) {getline; print}}'' inputfile

en sed :

sed -n ''/PATTERN/{n;p;n;p;n;p;n;p;n;p}'' inputfile

o

sed -n ''1{x;s/.*/####/;x};/PATTERN/{:a;n;p;x;s/.//;ta;q}'' inputfile

Los # caracteres representan un contador. Use uno menos que el número de líneas que desea imprimir.


Solución rápida y sucia: awk ''/PATTERN/ {i=0} { if (i<=5) {print $0}; i+=1} BEGIN {i=6}'' awk ''/PATTERN/ {i=0} { if (i<=5) {print $0}; i+=1} BEGIN {i=6}''


Tan limitada como la solución de Johnsyweb, pero utilizando un enfoque diferente y la característica avanzada de GNU awk permite separadores de registro RegEx completos que dan como resultado una pieza de código que, en mi humilde opinión, es muy poco comprensible:

awk -F///n ''{NF=5}NR-1'' RS="PATTERN[^/n]*." OFS=///n

Entonces, si quieres una solución estable que también sea legible, sigue la respuesta de Dennis Williamson (+1 para esa) pero quizás también tú simplemente disfrutes de la belleza de awk cuando awk líneas como esta.


awk al rescate!

para imprimir con la línea del patrón (un total de 6 líneas)

$ awk ''/^####PATTERN/{c=6} c&&c--'' file ####PATTERN####### #Line1 #Line2 #Line3 #Line4 #Line5

para saltear el patrón e imprimir las siguientes cinco líneas

$ awk ''c&&c--; /^####PATTERN/{c=5}'' file #Line1 #Line2 #Line3 #Line4 #Line5


grep "PATTERN" search-file -A 5 hará el trabajo por usted si decide dar grep una oportunidad.

Editar: También puede llamar a grep usando la función system() desde dentro de su script awk .


Editar: no notó que PATTERN no debería ser parte de la salida.

cat /etc/passwd | awk ''{if(a-->0){print;next}} /qmaild/{a=5}''

o

cat /etc/passwd | awk '' found && NR-6 < a{print} /qmaild/{a=NR;found=1}''

Lo más corto que se me ocurre es:

cat /etc/passwd | awk ''a-->0;/qmaild/{a=5}''

Lee como tiende a 0. / qmaild / establece un valor de 5 :-)


awk '' { if (lines > 0) { print; --lines; } } /PATTERN/ { lines = 5 } '' < input

Esto produce:

#Line1 #Line2 #Line3 #Line4 #Line5