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

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

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:

  1. Il file di log o la directory di log da monitorare
  2. 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
  3. Le stringhe / pattern che vuoi controllare
  4. Il tag – questo è il penultimo argomento che devi fornire. Registra le statistiche sui file di log che stai monitorando in / var / tmp / logXray
  5. 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.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *