Come grep per la stessa stringa ma più file contemporaneamente?


57

Ho una serie di file di registro che devo rivedere e vorrei cercare stringhe specifiche sugli stessi file contemporaneamente È possibile? Attualmente sto usando

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

Come posso usare questo e cercare le stringhe di più file contemporaneamente? Se questo è qualcosa che deve essere scritto, qualcuno può fornire un semplice script per farlo?


2
greppuò accettare più di un argomento di file.
jw013,

Risposte:


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

Come posso grepsaltare le directory, ma ancora controllare ricorsivamente tutti i file? grep -E 'text' **/*funziona, ma fornisce un messaggio di errore per ogni sottodirectory (e quindi controlla correttamente tutti i file in essi contenuti)
Jorn

4
@Jorn, dovresti davvero fare una nuova domanda, ma usafind . -type f -exec grep -E 'fatal|error|critical|failure|warning' {} +
Wildcard l'

20

Puoi usare qualcosa del genere:

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

Questo troverà ogni file con .logestensione e applicherà il grepcomando.


È stato troppo facile :) In realtà tutti i miei file sono .log, quindi "grep -E 'fatale | errore | critico | fallimento | avviso' * .log funziona troppo. Grazie!
user53029

1
Che grande sforzo di comprensione / adattamento utente53029!
Gilles Quenot,

1
Perché preoccuparsi xargse la possibilità di una grave rottura dello spazio bianco nei nomi dei file quando si può semplicemente usare find . -name '*.log' -exec grep -E 'fatal|error|critical|failure|warning' {} +?
Wildcard l'

16

Se è più semplice, puoi semplicemente specificare ogni file uno dopo l'altro.

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

2
Così semplice, ma lo cercavo da troppo tempo: 0
Adam Hughes,

3

Se è necessario eseguire grep su un set arbitrario di nomi di file che non possono essere recuperati da un'espressione regolare:

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

Qual è il vantaggio di incollare i nomi dei file uno dopo l'altro? È possibile compilare l'elenco dei nomi di file su un file di testo e quindi incollarlo.



0

Questo è stato un compito che ha richiesto molto tempo. E sì, sicuramente doveva essere creato uno script se stai cercando più stringhe in più registri diversi contemporaneamente. Ma recentemente ho dovuto farlo ed è stato abbastanza doloroso. Tuttavia, è fatto e pronto e può essere scaricato dal seguente link:

Download dello script di ricerca log

Il modo in cui funziona è piuttosto semplice.

Scenario 1: monitorare 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: monitorare MULTIPLE stringhe in UN UNICO file di registro

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

Scenario 3: monitorare 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

Appunti:

Il _P_ significa OR - Sostituisce il tubo "|" simbolo perché è meno probabile che dovrai cercare una stringa contenente "_P_". Se non desideri digitare "_P_", puoi semplicemente sostituire _P_ con "|".

Quando usi questo script, i parametri che cambierai frequentemente sono:

  1. Il file di registro o la directory di registro da monitorare
  2. L'età di un file di registro deve essere per poter essere monitorato. Non monitorare né scoprire alcun file di registro che ha un timestamp superiore a 60 minuti
  3. Le stringhe / i / i / i che vuoi cercare
  4. Il tag: questo è il penultimo argomento che devi fornire. Registra le statistiche sui file di registro che stai monitorando in / var / tmp / logXray
  5. L'opzione di registro -ndshow - Questo è il parametro che si desidera utilizzare se si desidera generare le voci dai registri trovati corrispondenti ai motivi specificati. 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: Scansiona più stringhe in più file di 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

Sistemi operativi: questo è stato testato su Ubuntu e Red Hat


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

Ciò cercherà "fatale o errore o critico o errore o avviso o stringa di ricerca" nei file con il nome che inizia con "log_file?" e l'estensione 'lo ' * nel percorso / percorso / a / il / file / e dare alla stringa di ricerca un colore casuale e stampare il numero di riga in cui è stata trovata.


Sicuramente questa è una risposta funzionante, ma l'utente ha chiesto di cercare usando uno schema, hai risposto usando una stringa di ricerca fissa. Siamo spiacenti, ma l'aggiunta di elementi che non sono stati richiesti, come la numerazione delle righe e la colorazione dei risultati, non è probabile che fornisca una risposta più vantaggiosa. Ma ci saranno altre domande a cui probabilmente sarà data risposta alle tue grepabilità, quindi buona fortuna per la tua carriera su USE!
Zagrimsan,

@zagrimsan punto preso, ho aggiunto -E 'errore fatale | critico | fallimento | avviso |' param ad esso.
Obaid,

Ehi, ha specificamente chiesto più file, non un modello di ricerca. Si prega di leggere di nuovo la domanda.
Obaid,

Cita dalla Q: "cerca stringhe specifiche", e la domanda mostra il modello di ricerca (contenente più stringhe da abbinare) che usa. Hai ragione, però, il titolo della domanda è leggermente diverso da quello che sta davvero chiedendo. A proposito, -Ee -Fnon possono essere utilizzati allo stesso tempo, sono in conflitto (errore di battitura?).
Zagrimsan,

0

La risposta di JigarGandhi dimostra l'uso del jolly asterisco. Ce ne sono altri e puoi vederli qui o correndo man 7 glob.

Uno di quelli che ho trovato utili è l'intervallo di corrispondenza con []. Poiché il sistema su cui lavoro produce file di registro numerati in sequenza product.log.1 product.log.2 ... product.log.200, ad esempio , è utile eseguire grep con un singolo comando su 3 o 4 file sequenziali, ma non di più. Così 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 per essere alla fine, quindi la risposta di flickerfly può essere semplificata

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

Si noti inoltre che questi caratteri jolly possono essere utilizzati in altri comandi, come cpad esempio.


0

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 sui file mancanti

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

Lo stavo solo sperimentando da solo per eseguire comandi che funzionano su più distro in cui si trova in un file rispetto all'altro a causa delle differenze del sistema operativo.

Registri di posta

sudo grep -is bob@example.com /var/log/{maillog,exim_mainlog,exim_rejectlog,mail.log,mail.err,syslog}

Registri di posta archiviati utilizzando 2> / dev / null per sopprimere gli avvisi .gz mancanti di zgrep

sudo zgrep -is bob@example.com /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 riscrivere l'intero percorso?

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.