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 utilizo 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?

Responder

grep -E "fatal|error|critical|failure|warning|" *.log 

Comentarios

  • ¿Cómo hago para que grep omita directorios, pero aún así verifique de forma recursiva todos archivos? grep -E 'text' **/* funciona, pero da un mensaje de error para cada subdirectorio (y luego verifica correctamente todos los archivos en ellos)
  • @Jorn, realmente debería hacer una nueva pregunta, pero use find . -type f -exec grep -E 'fatal|error|critical|failure|warning' {} +
  • Obtengo grep: invalid max count, así que usé la respuesta de jherrans

Respuesta

Podría usar algo como esto:

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

Esto busque todos los archivos con .log como extensión y aplique el comando grep.

Comentarios

Responder

Si es más simple, puede especificar cada archivo uno después del otro.

grep -E "fatal|error|critical|failure|warning" file1.log file2.log 

Respuesta

Si necesita para grep en un conjunto arbitrario de nombres de archivo que no se pueden recuperar con una expresión regular:

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

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

Responder

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

Vea 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 files

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

Estaba experimentando con esto yo mismo para hacer comandos que funcionan en múltiples distribuciones donde está en un archivo frente al otro debido a diferencias de 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 las advertencias .gz faltantes de zgrep

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

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

Respuesta

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

Buscará recursivamente en el archivo de subdirectorios s también

egrep -r "string1|string2" pathname 

Comentarios

Responder

Esta fue una tarea que consumió mucho tiempo. Y sí, ciertamente necesitaba ser programado si va a buscar múltiples cadenas en múltiples registros diferentes al mismo tiempo. Pero recientemente tuve que hacer esto y fue bastante doloroso. Sin embargo, está hecho y listo y puede descargar desde el siguiente enlace:

Descarga de secuencia de comandos de búsqueda de registro

La forma en que esto funciona es bastante simple.

Escenario 1: Supervise 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: Supervisa MÚLTIPLES cadenas 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 o 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 símbolo porque es menos probable que tenga que buscar una cadena que contenga «_P_». Si no desea escribir «_P_», puede sustituir la _P_ por «|».

Al utilizar 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 edad un archivo de registro debe ser para que sea monitoreado .. es decir, no monitorear ni descubrir ningún archivo de registro que tenga una marca de tiempo de más de 60 minutos
  3. Las cadenas / 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á monitoreando en / var / tmp / logXray
  5. La opción de registro -ndshow: este es el parámetro que desea utilizar si desea generar las entradas de los registros encontrados 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: Buscar varias cadenas en varios 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 

SO: Esto fue probado en Ubuntu y Red Hat

Respuesta

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 / al / archivo / y asigne a la cadena de búsqueda un color aleatorio y el número de línea de impresión en el que se encontró.

Comentarios

  • Seguro que esta es una respuesta que funciona, pero el usuario solicitó realizar una búsqueda con un patrón, respondió usando una cadena de búsqueda fija. Lo siento, pero agregar cosas que no se pidieron, como la numeración de líneas y el color de los resultados, probablemente no hará que la respuesta sea más beneficiosa. Pero habrá otras preguntas que probablemente puedan responderse a tus grep habilidades, ¡así que mucha suerte en tu carrera en USE!
  • @zagrimsan punto tomado, I ‘ hemos agregado el -E ‘ fatal | error | critic | failure | warning | ‘ param.
  • Y oye, pidió específicamente varios archivos, no un patrón de búsqueda. Lee la pregunta nuevamente.
  • Cita de la P: » busca cadenas específicas «, y la pregunta muestra el patrón de búsqueda (que contiene múltiples cadenas para hacer coincidir) que usa. Sin embargo, tiene razón en que el título de la pregunta se aleja un poco de lo que realmente está pidiendo. Por cierto, -E y -F no pueden ‘ t usarse al mismo tiempo, conflictivo (¿error tipográfico?).

Respuesta

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

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

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

grep para todos los archivos que terminan en product.log. 5, 6 o 7. No es necesario que el comodín esté 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 cp por ejemplo.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *