Ho una serie di file di log che devo rivedere e vorrei cercare stringhe specifiche negli stessi file contemporaneamente È possibile? Attualmente sto utilizzando
grep -E "fatal|error|critical|failure|warning|" /path_to_file
Come lo uso e cerco le stringhe di più file contemporaneamente? Se è necessario inserire uno script, qualcuno può fornire un semplice script per farlo?
Rispondi
grep -E "fatal|error|critical|failure|warning|" *.log
Commenti
- Come faccio a fare in modo che
grep
ignori le directory, ma continui a controllare ricorsivamente tutte File?grep -E 'text' **/*
funziona, ma fornisce un messaggio di errore per ogni sottodirectory (e quindi controlla correttamente tutti i file in esse) - @Jorn, davvero dovresti fare una nuova domanda, ma usa
find . -type f -exec grep -E 'fatal|error|critical|failure|warning' {} +
- Ottengo
grep: invalid max count
, quindi ho usato jherrans answer
Risposta
Potresti usare qualcosa di simile:
find . -name "*.log" | xargs grep -E "fatal|error|critical|failure|warning|"
Questo trova tutti i file con .log
come estensione e applica il comando grep
.
Commenti
- Perché preoccuparsi di
xargs
e della possibilità di gravi interruzioni degli spazi bianchi nei nomi dei file quando puoi semplicemente utilizzarefind . -name '*.log' -exec grep -E 'fatal|error|critical|failure|warning' {} +
?
Rispondi
Se è è più semplice, puoi semplicemente specificare ogni file uno dopo laltro.
grep -E "fatal|error|critical|failure|warning" file1.log file2.log
Risposta
Se hai bisogno di per eseguire grep su un insieme arbitrario di nomi di file che non possono essere recuperati da unespressione regolare:
grep -E "fatal|error|critical|failure|warning|" `cat<<FIN > file1 > file2 > ... > filen > FIN`
Qual è il vantaggio rispetto a incollare i nomi di file uno dopo laltro? Puoi compilare lelenco dei nomi dei file su un file di testo e poi incollarlo.
Risposta
Puoi anche usare le parentesi graffe se i file sono tutti nella stessa cartella.
Vedi un esempio
grep -E "fatal|error|critical|failure|warning|" /var/log/{messages,secure,syslog,dmesg}
Se aggiungi una s al grep questo sopprime gli errori di mancanza files
grep -sE "fatal|error|critical|failure|warning|" /var/log/{messages,secure,syslog,dmesg}
Stavo solo sperimentando questo io stesso per fare comandi che funzionano su più distribuzioni dove è in un file rispetto allaltro a causa delle differenze del sistema operativo.
Log di posta
sudo grep -is [email protected] /var/log/{maillog,exim_mainlog,exim_rejectlog,mail.log,mail.err,syslog}
Log di posta archiviati utilizzando 2> / dev / null per sopprimere gli avvisi .gz mancanti di zgrep
sudo zgrep -is [email protected] /var/log/{maillog*,exim_mainlog*,exim_rejectlog*,mail.log*,mail.err*,syslog*} 2>/dev/null
Riferimento: Esiste un modo per fare riferimento a più file in una directory senza ridigitare lintero percorso?
Rispondi
Se vuoi cercare in modo ricorsivo anche nei file delle sottodirectory Quindi puoi usare il comando seguente
Cercherà ricorsivamente nel file delle sottodirectory è anche
egrep -r "string1|string2" pathname
Commenti
- riguardo egrep
Risposta
Questa era unattività che richiedeva molto tempo. E sì, certamente doveva essere scritto se “stai cercando più stringhe in più log diversi contemporaneamente. Ma di recente ho dovuto farlo ed è stato abbastanza doloroso. Tuttavia, è fatto e pronto e può essere scaricato dal seguente link:
Download script di ricerca log
Il modo in cui funziona è piuttosto semplice.
Scenario 1: Monitora UNA stringa in UN SOLO file di registro
./logsearch.sh localhost /var/tmp/logXray autonda /var/log/messages 60m "can.*t.*open" "." 1 2 single_errCheck -ndshow
Scenario 2: Monitora MULTIPLE stringhe in UN SOLO file di log
./logsearch.sh localhost /var/tmp/logXray autonda /var/log/messages 60m "can.*t.*open_P_ntpd.*stat" "." 1 2 multi_errCheck -ndshow
Scenario 3: Monitoraggio di stringhe singole / multiple in più file di registro
./logsearch.sh localhost /var/tmp/logXray autonda /var/log 60m "can.*t.*open_P_ntpd.*stat" "." 1 2 multi_err_multi_logCheck -ndshow
Note:
_P_ significa OR – Sostituisce la barra verticale “|” s ymbol perché è meno probabile che tu debba cercare una stringa contenente “_P_”. Se non desideri digitare “_P_”, puoi semplicemente sostituire _P_ con “|”.
Quando utilizzi questo script, i parametri che cambierai frequentemente sono:
- Il file di log o la directory di log da monitorare
- Letà un file di log deve essere per poter essere monitorato..ie non monitorare o scoprire alcun file di log con un timestamp superiore a 60 minuti
- Le stringhe / pattern che vuoi controllare
- Il tag – questo è il penultimo argomento che devi fornire. Registra le statistiche sui file di log che stai monitorando in / var / tmp / logXray
- Lopzione log -ndshow – Questo è il parametro che vuoi usare se desideri produrre le voci dai log trovati che corrispondono ai pattern che hai specificato.Se vuoi solo vedere il conteggio totale di ogni modello trovato, sostituisci semplicemente “-ndshow” con “-ndfoundmul”.
Quando usi “-ndfoundmul”, otterrai un output simile 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)
Soluzione al problema del poster originale: Cerca più stringhe in più file di log
./logsearch.sh localhost /var/tmp/logXray autonda /var/log 60m "fatal_P_error_P_critical_P_failure_P_warning" "." 1 2 multierr_logCheck -ndshow
Sistemi operativi: Questo è stato testato su Ubuntu e Red Hat
Answer
grep -EFn "fatal|error|critical|failure|warning|search-string" /path/to/the/file/log_file?.lo* --color=auto
Questo cercherà “fatale o errore o critico o fallimento o avviso o stringa di ricerca” nei file il cui nome inizia con “log_file?” e lestensione “lo ” * nel percorso / path / to / the / file / e assegna alla stringa di ricerca un colore casuale e il numero di riga di stampa in cui è stata trovata.
Commenti
- Sicuramente questa è una risposta funzionante, ma lutente ha chiesto di eseguire la ricerca utilizzando un pattern, hai risposto utilizzando una stringa di ricerca fissa. Mi spiace, ma è improbabile che laggiunta di cose che non sono state richieste, come la numerazione delle righe e la colorazione dei risultati, renda una risposta più vantaggiosa. Ma ci saranno altre domande a cui probabilmente è possibile rispondere alle tue abilità
grep
quindi in bocca al lupo per la tua carriera in USE! - @zagrimsan punto preso, I ‘ ho aggiunto -E ‘ fatal | error | critical | failure | warning | ‘ param ad esso.
- E hey, ha specificamente richiesto più file, non un modello di ricerca. Si prega di leggere di nuovo la domanda.
- Citazione dalla Q: ” cerca stringhe specifiche ” e la domanda mostra il modello di ricerca (contenente più stringhe per cui trovare la corrispondenza) che usa. Hai ragione, però, che il titolo della domanda è leggermente diverso da quello che chiede veramente. A proposito,
-E
e-F
non possono ‘ essere utilizzati contemporaneamente, sono conflitto (errore di battitura?).
Risposta
JigarGandhi “La risposta dimostra luso del carattere jolly asterisco. Ce ne sono altri e puoi vederli qui o eseguendo man 7 glob
.
Uno di questi che ho trovato utile è la corrispondenza dellintervallo con []
. Poiché il sistema su cui lavoro produce log numerati sequenzialmente file ad es. product.log.1
product.log.2
...
product.log.200
, è comodo eseguire grep con un singolo comando su 3 o 4 file sequenziali ma non di più. Quindi questo
grep "whatever" product.log.[5-7]
eseguirà grep per tutti i file che terminano con product.log. 5, 6 o 7. Il carattere jolly non è necessario che sia alla fine, quindi flickerfly “la risposta può essere semplificata in
grep -E "fatal|error|critical|failure|warning" file[1,2].log
Tieni presente anche che questi caratteri jolly possono essere utilizzati in altri comandi come ad esempio in cp
.