grep -A 2 -B 3
imprime 2 líneas después de la cadena grep e imprime 3 líneas antes.
grep -C 3
imprime 3 líneas antes y 3 líneas después
Desafortunadamente, el grep
que estoy usando no admite estas opciones. ¿Hay algún comando o script alternativo disponible para simular esto? ¿Usando sed
/ awk
/ perl
/ scripts de shell?
text-processing
grep
awk
perl
Prashant Bhate
fuente
fuente
-C
cambio.GNU > /usr/local
. Los programas GNU tienen muchas extensiones muy útiles, y están diseñados para evitar restricciones arbitrarias (pero se paga caro en tamaño y, a veces, en rendimiento). Muchos sistemas propietarios tienen repositorios de paquetes "no oficiales" con GNU y otras herramientas. El "socio" no le informará acerca de ellos, incluso cuando sean administrados por el proveedor ...Respuestas:
Una forma moderadamente fea de hacerlo es
o sustituir
-c
con-C NUM
deNUM
líneas de contexto. Sin embargo, producirá una salida extra. (Si susdiff
soportes-u
/-U NUM
, será más limpio).Si
diff
no tiene-c
/-C
/-u
, todavía hay formas de hacerlo, pero son bastante feas. Por otro lado, un sistemadiff
que ni siquiera es compatible-c
probablemente tampoco tenga Perl.fuente
grep -v pattern file | diff -c - file
ACK sólo requiere Perl, e incluye
-A
,-B
y-C
las opciones que funcionan como grep. Utiliza la sintaxis de expresiones regulares de Perl en lugar de la de grep, y la forma en que selecciona los archivos para buscar es bastante diferente. Es posible que desee probar la-f
opción cuando la use (que imprime los archivos que buscará sin buscar nada).Se puede instalar como un script único que no requiere módulos no básicos. Simplemente colóquelo en su
~/bin
directorio (o en cualquier otro lugar de su RUTA al que tenga acceso de escritura) y asegúrese de que seachmod
ejecutable.fuente
ack
para su propio uso.Este simple script perl emula
grep -A
hasta cierto puntoTenga en cuenta que puede agregar una declaración de uso para que el script sea legible y utilizable;)
fuente
grep-A 3 foo
se ve mucho más natural quegrep-A foo 3
. :-)Simplemente puede instalar GNU grep o Ack (escrito en Perl, comprende muchas de las opciones de GNU grep y más).
Si prefiere apegarse a las herramientas estándar más un poco de secuencias de comandos, aquí hay una secuencia de comandos awk que emula el comportamiento de grep
-A
y-B
opciones de GNU . Mínimamente probadoEjecútelo como
grep-ac -vpattern=PATTERN -vbefore=NBEFORE -vafter=NAFTER
dóndePATTERN
está el patrón para buscar (una expresión regular extendida con algunas adiciones awk ),NBEFORE
yNAFTER
son los números de líneas para imprimir antes y después de una coincidencia respectivamente (por defecto a 0). Ejemplo:fuente
{ "exec" "awk" "-f" "$0" "$@"; }
: forma muy ingeniosa de sortear las limitaciones en el análisis de líneas shebang.Resulta que es bastante complicado emular -B, debido a los problemas que surgen cuando tienes líneas coincidentes que se siguen directamente. Esto prácticamente no permite el uso de ningún tipo de escaneo de archivos de paso único.
Me di cuenta de esto mientras jugaba con la siguiente aproximación:
Esto funcionará aproximadamente correctamente como grep -A7 -B3, con la advertencia descrita en el primer párrafo.
Una solución alternativa (también de un solo archivo) para este problema es usar perl para alimentar una cadena de comando:
fuente
shift @A if push(@A,$_)>7;
bit solo mantiene una matriz de tamaño máximo 7 alrededor. (ese es su parámetro -A). La segunda opción mantiene un archivo increíblemente pequeño (solo ejecuta el perl sin la capa externa sed para ver lo que se genera allí), pero lee el archivo dos veces.Con el uso
sed
, primero puede obtener los números de línea de las líneas coincidentes, disminuir e incrementar un número de línea dado en unwhile
bucle y luego usarsed -n "n1,n2p"
para imprimir líneas de contexto inicial (n1
) y final (n2
) (similar a lased
alternativa sugerida por el usuario455). Sin embargo, muchos procesos de lectura pueden conducir a un impacto en el rendimiento.ed
puede hacer referencia directa a las líneas anteriores y siguientes de una línea coincidente, pero falla si el rango de línea especificado no existe; por ejemplo, la línea coincidente es la línea número 2, pero deben imprimirse 5 líneas anteriores. Pored
lo tanto, es necesario agregar un número apropiado de líneas (vacías) al principio y al final. (Sined
embargo, para archivos grandes puede que no sea la herramienta adecuada, consulte: bfs - escáner de archivos grandes ).fuente