Me gustaría greppara 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 greppara 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 numpara establecer cuántas líneas antes del partido y -A numpara 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.
-Ay -Bfuncionará, como lo hará -C n(para nlíneas de contexto), o simplemente -n(para nlíneas de contexto ... siempre que n sea 1 a 9).
-nformato y descubrí que solo funciona hasta 9. Porque 15devuelve 5 líneas
-A, -Bo -C). Por lo general, el especificador de opción va seguido de un valor ( -o a.outpara especificar el archivo de salida en GCC), pero también puede funcionar como un simple interruptor / indicador ( -gpara 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 -15se interpreta -1 -5(dos opciones separadas) y se -5anula 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;
ripgrepSi se preocupan por el rendimiento, el uso ripgrepque 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-contexty -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 ay bvariables con número de líneas antes y después.
Es especialmente útil para el sistema que no soporta de grep -A, -By -Cpará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