una todos sobre palabra nombre mostrar los lineas hacer exacto doble contar comprimidos como buscar archivos archivo unix grep

unix - todos - hacer doble grep



Mostrar el nombre del archivo antes de hacer coincidir la línea(grep) (6)

¿Qué tal esto, que logré gracias, en parte, a este post?

Desea encontrar varios archivos; digamos, registros con nombres diferentes pero con un patrón (por ejemplo, filename=logfile.DATE ), dentro de varios directorios con un patrón (por ejemplo, /logsapp1, /logsapp2 ). Cada archivo tiene un patrón que desea grep (por ejemplo, "init time" ), y desea tener el "init time" de cada archivo, pero sabiendo a qué archivo pertenece.

find ./logsapp* -name logfile* | xargs -I{} grep "init time" {} /dev/null | tee outputfilename.txt

Entonces el outputfilename.txt sería algo así como

./logsapp1/logfile.22102015: init time: 10ms ./logsapp1/logfile.21102015: init time: 15ms ./logsapp2/logfile.21102015: init time: 17ms ./logsapp2/logfile.22102015: init time: 11ms

En general

find ./path_pattern/to_files* -name filename_pattern* | xargs -I{} grep "grep_pattern" {} /dev/null | tee outfilename.txt

Explicación:

find comando Buscar buscará los nombres de archivos basados ​​en el patrón

luego, pipe xargs -I{} redirigirá la salida de find a {}

que será la entrada para grep ""pattern" {}

Luego, el truco para hacer que grep muestre los nombres de archivo /dev/null

y finalmente, escriba la salida en el archivo con tee outputfile.txt

Esto me funcionó en grep versión 9.0.5 build 1989.

¿Cómo puedo hacer que grep muestre el nombre del archivo antes de las líneas coincidentes en su salida?


Esta es una ligera modificación de una solución anterior. Mi ejemplo busca la redirección stderr en los scripts de bash: grep ''2>'' $(find . -name "*.bash")


Intente este pequeño truco para convencer a grep para que piense que se trata de varios archivos, para que muestre el nombre del archivo:

grep ''pattern'' file /dev/null

Para obtener también el número de línea:

grep -n ''pattern'' file /dev/null


No hay truco necesario.

grep --with-filename ''pattern'' file

Con números de línea:

grep -n --with-filename ''pattern'' file


Si tienes las opciones -H y -n disponibles ( man grep es tu amigo):

$ cat file foo bar foobar $ grep -H foo file file:foo file:foobar $ grep -Hn foo file file:1:foo file:3:foobar

Opciones:

-H, --con nombre de archivo

Imprima el nombre del archivo para cada coincidencia. Este es el valor predeterminado cuando hay más de un archivo para buscar.

-n, --número de línea

Prefije cada línea de salida con el número de línea basado en 1 dentro de su archivo de entrada. (-n es especificado por POSIX.)

-H puede ser una extensión de GNU pero -n está especificado por POSIX.


grep ''search this'' *.txt

me ayudó a buscar en todos los archivos .txt (ingrese su propio valor de búsqueda, por supuesto).