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