Pregunta grep un archivo, pero muestra varias líneas que lo rodean?


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


2748
2017-08-12 17:55


origen


Respuestas:


por BSD o ÑU  grep puedes usar -B num para establecer cuántas líneas antes del partido y -A num para el número de líneas después del partido.

grep -B 3 -A 2 foo README.txt

Si desea el mismo número de líneas antes y después de que pueda usar -C num.

grep -C 3 foo README.txt

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


3667
2017-08-12 17:57



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


520
2017-08-12 17:59



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


66
2017-09-07 11:13



grep astring myfile -A 5 -B 5

Eso agregará "myfile" a "astring" y mostrará 5 líneas antes y después de cada partida.


32
2017-08-12 17:58



Yo 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 geniales. Me encuentro refiriéndome a Página de manual de grep mucho 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 información más útil además de la página man.

info grep

16
2017-08-12 18:42



Busque "17655" en "/some/file.txt" mostrando 10 líneas de contexto antes y después (usando Awk), salida precedida con el número de línea seguido de dos puntos. Úselo 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;

8
2017-10-08 00:21



Usa 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

5
2018-01-12 11:25



ripgrep

Si te importa el rendimiento, usa ripgrep que tiene una sintaxis similar a grep, p.ej.

rg -C5 "pattern" .

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

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

La herramienta está construida encima de Motor de expresiones regulares de Rust que lo hace muy eficiente en los datos de gran tamaño.


2
2018-04-11 10:28



Aquí está el @Ygor solución 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: reemplazar a y b variables con número de líneas antes y después

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


0
2018-04-11 10:24