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