Me gustaría grep
para una cadena, pero también mostrar las cinco líneas anteriores y las siguientes cinco líneas, así como la línea coincidente. ¿Cómo podría hacer esto?
man grep | grep -C 1 context
:)
man grep | grep -C 1 "\-C"
;)
Me gustaría grep
para una cadena, pero también mostrar las cinco líneas anteriores y las siguientes cinco líneas, así como la línea coincidente. ¿Cómo podría hacer esto?
man grep | grep -C 1 context
:)
man grep | grep -C 1 "\-C"
;)
Respuestas:
Para BSD o GNU grep
, puede 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 usar -C num
.
grep -C 3 foo README.txt
Esto mostrará 3 líneas antes y 3 líneas después.
-A
y -B
funcionará, como lo hará -C n
(para n
líneas de contexto), o simplemente -n
(para n
líneas de contexto ... siempre que n sea 1 a 9).
-n
formato y descubrí que solo funciona hasta 9
. Porque 15
devuelve 5 líneas
-A
, -B
o -C
). Por lo general, el especificador de opción va seguido de un valor ( -o a.out
para especificar el archivo de salida en GCC), pero también puede funcionar como un simple interruptor / indicador ( -g
para habilitar la información de depuración en GCC). Sin embargo, los espacios entre las opciones son opcionales, por lo que para las opciones sin valor, es posible fusionarlas ( -ABC
), lo que significa que -15
se interpreta -1 -5
(dos opciones separadas) y se -5
anula el -1
.
ack funciona con argumentos similares a grep y acepta -C
. Pero generalmente es mejor para buscar a través del código.
grep
, no está seguro de usarlo para "publicitar" ack
(que es una gran herramienta, de hecho) es una buena idea ...
grep astring myfile -A 5 -B 5
Eso marcará "myfile" por "astring" y mostrará 5 líneas antes y después de cada partida.
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 geniales. Me encuentro refiriéndome mucho a la página de manual de grep porque hay mucho que puedes hacer con ella.
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 de manual.
info grep
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
Busque "17655" en "/some/file.txt" que muestra el contexto de 10 líneas antes y después (usando Awk), salida precedida por un número de línea seguido de dos puntos. Use esto en Solaris cuando 'grep' no sea compatible con 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;
ripgrep
Si se preocupan por el rendimiento, el uso 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 partido.
También hay parámetros como -A
/ --after-context
y -B
/ --before-context
.
La herramienta está construida sobre el motor regex de Rust, lo que lo hace muy eficiente en los datos grandes.
Aquí está la solución @Ygor enawk
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 soporta de grep -A
, -B
y -C
parámetros.
Si busca código con frecuencia, AG el buscador de plata es mucho más eficiente (es decir, más rápido) que grep.
Muestra líneas de contexto utilizando la opción -C.
P.ej:
ag -C 3 "foo" myFile
line 1
line 2
line 3
line that has "foo"
line 5
line 6
line 7