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).