Pregunta

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

¿Fue útil?

Solución

Para 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, puede utilizar -C num.

grep -C 3 foo README.txt

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

Otros consejos

-A y -B funcionará, al igual que -C n (para n líneas de contexto), o simplemente -n (para n líneas de contexto...siempre que n sea de 1 a 9).

ack trabaja con argumentos similares a grep y acepta -C.Pero suele ser mejor para buscar mediante código.

grep astring myfile -A 5 -B 5

Eso buscará "myfile" en lugar de "astring" y mostrará 5 líneas antes y después de cada coincidencia.

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 man realmente excelentes.Me encuentro refiriéndome a página de manual de grep mucho porque hay mucho que puedes hacer con él.

man grep

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

info grep

Busque "17655" en "/some/file.txt" que muestra el contexto de 10 líneas antes y después (usando Awk), la salida está precedida por el número de línea seguido de dos puntos.Utilícelo 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;

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

ripgrep

Si le importa el rendimiento, utilice 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 como -A/--after-context y -B/--before-context.

La herramienta está construida sobre Motor de expresiones regulares de Rust lo que lo hace muy eficiente en los grandes datos.

$grep thestring thefile -5

-5 te consigue 5 líneas por encima y por debajo del partido 'thestring' es equivalente a -c 5 o -a 5 -b 5

Grep tiene una opción llamada Context Line Control, puedes usar el --contect en eso, simplemente,

| grep -C 5

o

| grep -5

debería hacer el truco

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 sistemas que no soportan grep. -A, -B y -C parámetros.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top