varios varias regulares patrones parametros palabras palabra expresiones exacta ejemplos ejemplo comando buscar search logging grep command-line-interface

search - regulares - grep un archivo, pero muestra varias líneas circundantes?



grep varios patrones (9)

Me gustaría grep para una cadena, pero también mostrar las cinco líneas anteriores y las cinco líneas siguientes, así como la línea correspondiente. ¿Cómo podría hacer esto?


ripgrep

Si te importa el rendimiento, usa ripgrep que tiene una sintaxis similar a grep , por ejemplo

rg -C5 "pattern" .

-C , --context NUM - Muestra NUM líneas antes y después de cada coincidencia.

También hay parámetros como -A / --after-context y -B / --before-context .

La herramienta está construida sobre el motor de expresiones regulares de Rust, lo que lo hace muy efficient en los datos de gran tamaño.


Aquí está la solución @Ygor en awk

awk ''c-->0;$0~s{if(b)for(c=b+1;c>1;c--)print r[(NR-c+1)%b];print;c=a}b{r[NR%b]=$0}'' b=3 a=3 s="pattern" myfile

Nota: Reemplace las variables b con el número de líneas antes y después.

Es especialmente útil para el sistema que no admite los parámetros grep -A , -B y -C .


Busque "17655" en "/some/file.txt" que muestre 10 líneas de contexto antes y después (usando Awk), salida precedida por el número de línea seguido de dos puntos. Use esto en Solaris cuando ''grep'' no admita las opciones "- [ACB]".

awk '' /17655/ { for (i = (b + 1) % 10; i != b; i = (i + 1) % 10) { print before[i] } print (NR ":" ($0)) a = 10 } a-- > 0 { print (NR ":" ($0)) } { before[b] = (NR ":" ($0)) b = (b + 1) % 10 }'' /some/file.txt;


Normalmente uso

grep searchstring file -C n # n for number of lines of context up and down

Muchas de las herramientas como grep también tienen archivos de hombre realmente geniales. Me estoy refiriendo mucho a la página del manual de grep porque hay mucho que puedes hacer con eso.

man grep

Muchas herramientas de GNU también tienen una página de información que puede tener más información útil además de la página de manual.

info grep


Para BSD o GNU grep puede usar -B num para establecer cuántas líneas antes de la coincidencia y -A num para la cantidad de líneas después de la coincidencia.

grep -B 3 -A 2 foo README.txt

Si desea el mismo número de líneas antes y después, puede utilizar -C num .

grep -C 3 foo README.txt

Esto mostrará 3 líneas antes y 3 líneas después.


Usar grep

$ grep --help | grep -i context Context control: -B, --before-context=NUM print NUM lines of leading context -A, --after-context=NUM print NUM lines of trailing context -C, --context=NUM print NUM lines of output context -NUM same as --context=NUM


ack trabaja con argumentos similares a grep, y acepta -C . Pero generalmente es mejor para buscar a través del código.


-A y -B funcionarán, como lo hará -C n (para n líneas de contexto), o simplemente -n (para n líneas de contexto).


grep astring myfile -A 5 -B 5

Eso significa grep "myfile" para "astring", y muestra 5 líneas antes y después de cada partido