¿Grep un archivo, pero muestra varias líneas circundantes?
-
08-06-2019 - |
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?
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.