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 grepque 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

-Ccambio.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
-ccon-C NUMdeNUMlíneas de contexto. Sin embargo, producirá una salida extra. (Si susdiffsoportes-u/-U NUM, será más limpio).Si
diffno tiene-c/-C/-u, todavía hay formas de hacerlo, pero son bastante feas. Por otro lado, un sistemadiffque ni siquiera es compatible-cprobablemente tampoco tenga Perl.fuente
grep -v pattern file | diff -c - fileACK sólo requiere Perl, e incluye
-A,-By-Clas 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-fopció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
~/bindirectorio (o en cualquier otro lugar de su RUTA al que tenga acceso de escritura) y asegúrese de que seachmodejecutable.fuente
ackpara su propio uso.Este simple script perl emula
grep -Ahasta cierto puntoTenga en cuenta que puede agregar una declaración de uso para que el script sea legible y utilizable;)
fuente
grep-A 3 foose 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
-Ay-Bopciones de GNU . Mínimamente probadoEjecútelo como
grep-ac -vpattern=PATTERN -vbefore=NBEFORE -vafter=NAFTERdóndePATTERNestá el patrón para buscar (una expresión regular extendida con algunas adiciones awk ),NBEFOREyNAFTERson 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 unwhilebucle y luego usarsed -n "n1,n2p"para imprimir líneas de contexto inicial (n1) y final (n2) (similar a lasedalternativa sugerida por el usuario455). Sin embargo, muchos procesos de lectura pueden conducir a un impacto en el rendimiento.edpuede 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. Poredlo tanto, es necesario agregar un número apropiado de líneas (vacías) al principio y al final. (Sinedembargo, para archivos grandes puede que no sea la herramienta adecuada, consulte: bfs - escáner de archivos grandes ).fuente