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




grep-v ejemplo (8)

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.

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?


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 .


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

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

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;

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


-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).


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.





command-line-interface