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
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:
- El archivo de registro o el directorio de registro que se supervisará
- 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
- Las cadenas / patrones que desea ver
- 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
- 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.
xargs
y la posibilidad de roturas severas en los espacios en blanco en los nombres de archivo cuando puede usarfind . -name '*.log' -exec grep -E 'fatal|error|critical|failure|warning' {} +
?