¿Cómo grep para la misma cadena pero varios archivos al mismo tiempo?

57

Tengo un conjunto de archivos de registro que necesito revisar y me gustaría buscar cadenas específicas en los mismos archivos a la vez. ¿Es esto posible? Actualmente estoy usando

grep -E 'fatal|error|critical|failure|warning|' /path_to_file

¿Cómo uso esto y busco las cadenas de varios archivos a la vez? Si esto es algo que necesita ser programado, ¿alguien puede proporcionar un script simple para hacer esto?

usuario53029
fuente
2
greppuede tomar más de un argumento de archivo.
jw013

Respuestas:

61
grep -E 'fatal|error|critical|failure|warning|' *.log
JigarGandhi
fuente
¿Cómo puedo grepomitir directorios, pero aún así verifico recursivamente todos los archivos? grep -E 'text' **/*funciona, pero da un mensaje de error para cada subdirectorio (y luego verifica correctamente todos los archivos en ellos)
Jorn
44
@Jorn, realmente deberías hacer una nueva pregunta, pero usafind . -type f -exec grep -E 'fatal|error|critical|failure|warning' {} +
Wildcard el
20

Podrías usar algo como esto:

find . -name "*.log" | xargs grep -E 'fatal|error|critical|failure|warning|'

Esto encontrará todos los archivos con una .logextensión y aplicará el grepcomando.

jherran
fuente
Eso fue demasiado fácil :) En realidad todos mis archivos .log son tan "grep -E.! 'Fatal | Error | crítica | fracaso | advertencia' * .log también funciona Gracias
user53029
1
¡Qué gran esfuerzo de comprensión / adaptación user53029!
Gilles Quenot
1
¿Por qué molestarse xargsy la posibilidad de rotura severa en el espacio en blanco en los nombres de archivo cuando solo puede usar find . -name '*.log' -exec grep -E 'fatal|error|critical|failure|warning' {} +?
Comodín el
16

Si es más simple, puede especificar cada archivo uno tras otro.

grep -E 'fatal|error|critical|failure|warning' file1.log file2.log 
flickerfly
fuente
2
Tan simple, pero estuve buscando esto por mucho tiempo: 0
Adam Hughes
3

Si necesita grep en un conjunto arbitrario de nombres de archivo que no pueden ser recuperados por una expresión regular:

grep -E 'fatal|error|critical|failure|warning|' `cat<<FIN
> file1
> file2
> ...
> filen
> FIN`

¿Cuál es la ventaja de pegar los nombres de archivo uno tras otro? Puede compilar la lista de nombres de archivo en un archivo de texto y luego pegarla.

Diego Pino
fuente
1

Si desea buscar recursivamente en archivos de subdirectorios también, entonces puede usar el siguiente comando

También buscará recursivamente en archivos de subdirectorios

egrep -r "string1|string2" pathname
Praveen Kumar BS
fuente
1
con respecto a egrep
Jeff Schaller
0

Esta fue una tarea muy lenta. Y sí, sin duda tenía que estar programado si vas a buscar varias cadenas en varios registros diferentes al mismo tiempo. Pero recientemente tuve que hacer esto y fue bastante doloroso. Sin embargo, está hecho y listo y se puede descargar desde el siguiente enlace:

Descarga de script de búsqueda de registro

La forma en que esto funciona es bastante simple.

Escenario 1: supervisar UNA cadena en solo UN archivo de registro

./logsearch.sh localhost /var/tmp/logXray autonda /var/log/messages 60m 'can.*t.*open' '.'  1 2 single_errCheck -ndshow

Escenario 2: supervise cadenas MÚLTIPLES en UN SOLO archivo de registro

./logsearch.sh localhost /var/tmp/logXray autonda /var/log/messages 60m 'can.*t.*open_P_ntpd.*stat' '.'  1 2 multi_errCheck -ndshow

Escenario 3: supervisar cadenas individuales / múltiples en varios archivos de registro

./logsearch.sh localhost /var/tmp/logXray autonda /var/log 60m 'can.*t.*open_P_ntpd.*stat' '.'  1 2 multi_err_multi_logCheck -ndshow

Notas:

El _P_ significa OR - Reemplaza la tubería "|" símbolo porque es menos probable que tenga que buscar una cadena que contenga "_P_". Si no desea escribir "_P_", puede sustituir el _P_ con "|".

Cuando use este script, los parámetros que cambiará con frecuencia son:

  1. El archivo de registro o el directorio de registro que se supervisará
  2. La antigüedad de un archivo de registro debe ser para que pueda ser monitoreado ... no supervise ni descubra ningún archivo de registro que tenga una marca de tiempo de más de 60 minutos
  3. Las cadenas / patrones / patrones que desea ver
  4. La etiqueta: este es el penúltimo argumento que debe proporcionar. Registra estadísticas sobre los archivos de registro que está supervisando en / var / tmp / logXray
  5. La opción de registro -ndshow: este es el parámetro que desea usar si desea generar las entradas de los registros que coinciden con los patrones que especificó. Si solo desea ver el recuento total de cada patrón encontrado, simplemente reemplace '-ndshow' con '-ndfoundmul'.

Cuando use '-ndfoundmul', obtendrá un resultado similar a:

[root@dgphxtest001]# ./logsearch.sh localhost /var/tmp/logXray autonda /var/log/messages 60m 'can.*t.*open_P_ntpd.*stat' '.'  1 2 blahblahA -ndfoundmul
OK: [/var/log/messages][1]  /var/log/messages:P=(can_t_open=0 ntpd_stat=0)_F=(117s)_R=(228,228=0) 

Solución al problema del póster original: escanear en busca de cadenas múltiples en múltiples archivos de registro

./logsearch.sh localhost /var/tmp/logXray autonda /var/log 60m 'fatal_P_error_P_critical_P_failure_P_warning' '.'  1 2 multierr_logCheck -ndshow

Sistemas operativos: Esto fue probado en Ubuntu y Red Hat

Monitoreo de Nagios
fuente
0
grep -EFn "fatal|error|critical|failure|warning|search-string" /path/to/the/file/log_file?.lo* --color=auto

Esto buscará 'fatal o error o crítico o falla o advertencia o cadena de búsqueda' en los archivos con el nombre que comienza con 'log_file?' y la extensión 'lo ' * en la ruta / ruta / a / el / archivo / y le da a la cadena de búsqueda un color aleatorio y un número de línea de impresión en el que se encontró.

Obaid
fuente
Claro que esta es una respuesta que funciona, pero el usuario solicitó buscar usando un patrón, usted respondió usando una cadena de búsqueda fija. Lo sentimos, pero agregar cosas que no se pidieron, como la numeración de líneas y la coloración de los resultados, no es probable que la respuesta sea más beneficiosa. ¡Pero habrá otras preguntas que probablemente puedan responder a tus grephabilidades, así que la mejor de las suertes en tu carrera USE!
zagrimsan
@zagrimsan punto tomado, he agregado el -E 'fatal | error | crítico | falla | advertencia |' Param a ello.
Obaid
Y oye, solicitó específicamente varios archivos, no un patrón de búsqueda. Por favor lea la pregunta nuevamente.
Obaid
Cita de la Q: "buscar cadenas específicas", y la pregunta muestra el patrón de búsqueda (que contiene varias cadenas para que coincida) que utiliza. Sin embargo, tiene razón en que el título de la pregunta está ligeramente alejado de lo que realmente está pidiendo. Por cierto, -Ey -Fno se pueden usar al mismo tiempo, son conflictivos (¿error tipográfico?).
zagrimsan
0

La respuesta de JigarGandhi demuestra el uso del comodín asterisco. Hay más de ellos y puedes verlos aquí o corriendo man 7 glob.

Uno de ellos que me pareció útil es el rango de coincidencia []. Dado que el sistema en el que trabajo produce archivos de registro numerados secuencialmente product.log.1 product.log.2 ... product.log.200, por ejemplo , es útil hacer grep con un solo comando en 3 o 4 archivos secuenciales, pero no más. Así que esto

grep 'whatever' product.log.[5-7]

grep para todos los archivos que terminan con product.log. 5, 6 o 7. El comodín no es necesario para estar al final, por lo que la respuesta de flickerfly se puede simplificar a

grep -E 'fatal|error|critical|failure|warning' file[1,2].log

Tenga en cuenta también que estos comodines se pueden usar en otros comandos, así como en, cppor ejemplo.

Stelios Adamantidis
fuente
0

También puede usar llaves si los archivos son todos de la misma carpeta.

Ver un ejemplo

grep -E 'fatal|error|critical|failure|warning|' /var/log/{messages,secure,syslog,dmesg}

Si agrega una s al grep, esto suprime los errores sobre archivos faltantes

grep -sE 'fatal|error|critical|failure|warning|' /var/log/{messages,secure,syslog,dmesg}

Solo estaba experimentando con esto yo mismo para hacer comandos que funcionan en varias distribuciones donde está en un archivo frente al otro debido a las diferencias del sistema operativo.

Registros de correo

sudo grep -is [email protected] /var/log/{maillog,exim_mainlog,exim_rejectlog,mail.log,mail.err,syslog}

Registros de correo archivados usando 2> / dev / null para suprimir zgrep que faltan advertencias .gz

sudo zgrep -is [email protected] /var/log/{maillog*,exim_mainlog*,exim_rejectlog*,mail.log*,mail.err*,syslog*} 2>/dev/null

Referencia: ¿Hay alguna forma de hacer referencia a varios archivos en un directorio sin volver a escribir la ruta completa?

Miguel
fuente