Jak grepować dla tego samego ciągu, ale dla wielu plików jednocześnie?

57

Mam zestaw plików dziennika, które muszę przejrzeć i chciałbym wyszukać określone ciągi w tych samych plikach na raz. Czy to możliwe? Obecnie używam

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

Jak z tego korzystać i wyszukiwać ciągi wielu plików jednocześnie? Jeśli jest to coś, co wymaga skryptu, czy ktoś może podać prosty skrypt, aby to zrobić?

użytkownik53029
źródło
2
grepmoże przyjąć więcej niż jeden argument pliku.
jw013,

Odpowiedzi:

61
grep -E 'fatal|error|critical|failure|warning|' *.log
JigarGandhi
źródło
Jak mogę greppominąć katalogi, ale nadal rekurencyjnie sprawdzać wszystkie pliki? grep -E 'text' **/*działa, ale wyświetla komunikat o błędzie dla każdego podkatalogu (a następnie poprawnie sprawdza wszystkie zawarte w nim pliki)
Jorn
4
@Jorn, naprawdę powinieneś zadać nowe pytanie, ale użyjfind . -type f -exec grep -E 'fatal|error|critical|failure|warning' {} +
Wildcard,
20

Możesz użyć czegoś takiego:

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

Znajdzie każdy plik z .logrozszerzeniem i zastosuje greppolecenie.

Jherran
źródło
To było zbyt łatwe :) Właściwie wszystkie moje pliki są .log, więc "grep -E 'fatal | error | krytyczny | failure | warning' * .log też działa. Dzięki!
user53029
1
Cóż za wielki wysiłek zrozumienia / adaptacji user53029!
Gilles Quenot,
1
Po co męczyć się z xargsmożliwością poważnego pęknięcia białych znaków w nazwach plików, kiedy można po prostu użyć find . -name '*.log' -exec grep -E 'fatal|error|critical|failure|warning' {} +?
Wildcard,
16

Jeśli jest to prostsze, możesz po prostu określić każdy plik jeden po drugim.

grep -E 'fatal|error|critical|failure|warning' file1.log file2.log 
Flickerfly
źródło
2
To takie proste, ale szukało tego zbyt długo: 0
Adam Hughes
3

Jeśli potrzebujesz grepować na dowolny zestaw nazw plików, których nie można odzyskać za pomocą wyrażenia regularnego:

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

Jaka jest przewaga nad wklejaniem nazw plików jeden po drugim? Możesz skompilować listę nazw plików w pliku tekstowym, a następnie wkleić.

Diego Pino
źródło
1

Jeśli chcesz przeszukiwać rekurencyjnie także w plikach podkatalogów, możesz użyć poniższego polecenia

Będzie również wyszukiwał rekurencyjnie w plikach podkatalogów

egrep -r "string1|string2" pathname
Praveen Kumar BS
źródło
1
odnośnie egrep
Jeff Schaller
0

To było bardzo czasochłonne zadanie. I tak, z pewnością musiał być skryptowany, jeśli zamierzasz wyszukiwać wiele ciągów w wielu różnych dziennikach jednocześnie. Ale ostatnio musiałem to zrobić i było to dość bolesne. Niemniej jednak jest to gotowe i gotowe i można je pobrać z następującego linku:

Skrypt wyszukiwania dziennika Pobierz

Sposób działania jest dość prosty.

Scenariusz 1: Monitoruj JEDEN ciąg w JEDNYM pliku dziennika

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

Scenariusz 2: Monitoruj WIELE ciągów w JEDNYM pliku dziennika

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

Scenariusz 3: Monitoruj pojedyncze / wiele ciągów w wielu plikach dziennika

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

Uwagi:

_P_ oznacza LUB - zastępuje potok „|” symbol, ponieważ jest mniej prawdopodobne, że będziesz musiał wyszukać ciąg zawierający „_P_”. Jeśli nie chcesz wpisywać „_P_”, możesz po prostu zastąpić _P_ przez „|”.

Podczas korzystania z tego skryptu parametry, które często zmieniasz, to:

  1. Plik dziennika lub katalog dziennika do monitorowania
  2. Wiek, w jakim plik dziennika musi być monitorowany. Nie monitoruj ani nie wykrywaj żadnego pliku dziennika, który ma znacznik czasu dłuższy niż 60 minut
  3. Ciągi / wzorce, na które chcesz uważać
  4. Tag - jest to przedostatni argument, który musisz podać. Zapisuje statystyki dotyczące monitorowanych plików dziennika w / var / tmp / logXray
  5. Opcja dziennika -ndshow - jest to parametr, którego chcesz użyć, jeśli chcesz wypisywać wpisy ze znalezionych dzienników pasujących do podanych wzorców. Jeśli chcesz tylko zobaczyć całkowitą liczbę znalezionych znalezionych wzorów, po prostu zamień „-ndshow” na „-ndfoundmul”.

Korzystając z opcji -ndfoundmul, otrzymasz wynik podobny do:

[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) 

Rozwiązanie problemu z oryginalnym plakatem: Skanuj w poszukiwaniu wielu ciągów znaków w wielu plikach dziennika

./logsearch.sh localhost /var/tmp/logXray autonda /var/log 60m 'fatal_P_error_P_critical_P_failure_P_warning' '.'  1 2 multierr_logCheck -ndshow

Systemy operacyjne: przetestowano na Ubuntu i Red Hat

Monitorowanie Nagios
źródło
0
grep -EFn "fatal|error|critical|failure|warning|search-string" /path/to/the/file/log_file?.lo* --color=auto

Spowoduje to wyszukanie „krytycznych lub błędów lub krytycznych, awarii lub ostrzeżeń lub ciągu wyszukiwania” w plikach o nazwie zaczynającej się od „log_file?” i rozszerzenie „lo ” * w ścieżce / path / to / the / file / i nadaj ciągowi wyszukiwania losowy kolor i numer linii wydruku, na której został znaleziony.

Obaid
źródło
Pewnie, że jest to działająca odpowiedź, ale użytkownik poprosił o wyszukiwanie za pomocą wzorca, odpowiedziałeś za pomocą stałego ciągu wyszukiwania. Przykro nam, ale dodanie rzeczy, o które nie pytano, takich jak numeracja linii i kolorystyka wyników, raczej nie uczyni odpowiedzi bardziej korzystną. Ale będą też inne pytania, na które prawdopodobnie można odpowiedzieć na twoje grepumiejętności, więc powodzenia w karierze USE!
zagrimsan
@zagrimsan point wzięty, dodałem -E „błąd krytyczny | krytyczny | błąd | ostrzeżenie | ' param do tego.
Obaid,
I hej, specjalnie poprosił o wiele plików, a nie wzorzec wyszukiwania. Przeczytaj ponownie pytanie.
Obaid,
Cytat z pytania: „wyszukaj określone ciągi”, a pytanie pokazuje wzorzec wyszukiwania (zawierający wiele pasujących ciągów), którego używa. Masz jednak rację, że tytuł pytania nieco odbiega od tego, o co tak naprawdę prosi. BTW -Ei -Fnie można ich używać jednocześnie, są w konflikcie (literówka?).
zagrimsan
0

Odpowiedź JigarGandhi pokazuje użycie wieloznacznej gwiazdki. Jest ich więcej i możesz je zobaczyć tutaj lub biegając man 7 glob.

Jednym z nich, który uznałem za użyteczny, jest dopasowanie zakresu []. Ponieważ system, nad którym pracuję, tworzy np. Pliki dziennika o numerach sekwencyjnych product.log.1 product.log.2 ... product.log.200, wygodnie jest grep za pomocą jednego polecenia na 3 lub 4 plikach sekwencyjnych, ale nie więcej. Więc to

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

będzie grep dla wszystkich plików z rozszerzeniem product.log. 5, 6 lub 7. Symbol wieloznaczny nie musi znajdować się na końcu, więc odpowiedź flickerfly można uprościć

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

Zauważ też, że te symbole wieloznaczne mogą być używane w innych poleceniach, jak cpna przykład w.

Stelios Adamantidis
źródło
0

Możesz także użyć nawiasów klamrowych, jeśli wszystkie pliki znajdują się w tym samym folderze.

Zobacz przykład

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

Jeśli dodasz s do grep, to pomija błędy dotyczące brakujących plików

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

Właśnie eksperymentowałem z tym, aby wykonywać polecenia, które działają w wielu dystrybucjach, gdzie jest w jednym pliku w porównaniu do drugiego z powodu różnic w systemie operacyjnym.

Dzienniki poczty

sudo grep -is [email protected] /var/log/{maillog,exim_mainlog,exim_rejectlog,mail.log,mail.err,syslog}

Zarchiwizowane dzienniki poczty za pomocą 2> / dev / null, aby ukryć zgrep brakujące ostrzeżenia .gz

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

Odwołanie: Czy istnieje sposób odwoływania się do wielu plików w katalogu bez ponownego wpisywania całej ścieżki?

mikrofon
źródło