Mam zestaw plików dziennika, które muszę przejrzeć i chcę od razu przeszukać określone ciągi w tych samych plikach. Czy to możliwe? Obecnie używam
grep -E "fatal|error|critical|failure|warning|" /path_to_file
Jak tego używać i wyszukiwać ciągi wielu plików jednocześnie? Jeśli jest to coś, co wymaga scenariusza, czy ktoś może dostarczyć prosty skrypt, aby to zrobić?
Odpowiedź
grep -E "fatal|error|critical|failure|warning|" *.log
Komentarze
- Jak mogę
grep
pomijać katalogi, ale nadal rekurencyjnie sprawdzać wszystkie akta?grep -E 'text' **/*
działa, ale wyświetla komunikat o błędzie dla każdego podkatalogu (a następnie poprawnie sprawdza wszystkie pliki w nich) - @Jorn, naprawdę powinieneś zadać nowe pytanie, ale używaj
find . -type f -exec grep -E 'fatal|error|critical|failure|warning' {} +
- Otrzymuję
grep: invalid max count
, więc użyłem odpowiedzi jherrans
Odpowiedź
Możesz użyć czegoś takiego:
find . -name "*.log" | xargs grep -E "fatal|error|critical|failure|warning|"
To będzie znajdź każdy plik z rozszerzeniem .log
i zastosuj polecenie grep
.
Komentarze
Odpowiedz
Jeśli tak jest prostsze, możesz po prostu określić każdy plik jeden po drugim.
grep -E "fatal|error|critical|failure|warning" file1.log file2.log
Odpowiedź
Jeśli potrzebujesz grep na dowolnym zestawie nazw plików, których nie można pobrać 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 jedna po drugiej? Możesz skompilować listę nazw plików w pliku tekstowym, a następnie wkleić ją.
Odpowiedź
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, pominie to błędy dotyczące brakujących pliki
grep -sE "fatal|error|critical|failure|warning|" /var/log/{messages,secure,syslog,dmesg}
Po prostu eksperymentowałem z tym sam, wykonując polecenia, które działają w wielu dystrybucjach, gdzie jest to w jednym pliku w porównaniu z drugim 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 przy użyciu 2> / dev / null do pomijania brakujących ostrzeżeń zgrep .gz
sudo zgrep -is [email protected] /var/log/{maillog*,exim_mainlog*,exim_rejectlog*,mail.log*,mail.err*,syslog*} 2>/dev/null
Odniesienie: Czy istnieje sposób na odwołanie się do wielu plików w katalogu bez ponownego wpisywania całej ścieżki?
Odpowiedź
Jeśli chcesz wyszukiwać rekurencyjnie również w podkatalogach plików To możesz użyć poniższego polecenia
Będzie przeszukiwać rekursywnie w pliku podkatalogów s również
egrep -r "string1|string2" pathname
Komentarze
Odpowiedź
To było bardzo czasochłonne zadanie. I tak, to z pewnością wymagało skryptu, jeśli zamierzasz szukać wielu ciągów w wielu różnych dziennikach w tym samym czasie. Ale ostatnio musiałem to zrobić i było to dość bolesne. Niemniej jednak jest gotowe i gotowe i można można pobrać z następującego łącza:
Pobieranie skryptu wyszukiwania dziennika
Sposób, w jaki to działa, jest dość prosty.
Scenariusz 1: Monitoruj JEDEN ciąg w tylko 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 pojedynczy / 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 OR – Zastępuje pionową kreskę „|” s ymbol, ponieważ jest mniej prawdopodobne, że będziesz musiał szukać łańcucha zawierającego „_P_”. Jeśli nie chcesz wpisywać „_P_”, możesz po prostu zastąpić _P_ przez „|”.
Podczas korzystania z tego skryptu parametry, które będziesz często zmieniać, to:
- Plik dziennika lub katalog dziennika do monitorowania
- Wiek plik dziennika musi być, aby był monitorowany, tj. nie monitoruj ani nie wykrywaj żadnego pliku dziennika, który ma znacznik czasu powyżej 60 minut
- Ciągi / wzorce, które chcesz obserwować
- Znacznik – jest to przedostatni argument, który musisz podać. Zapisuje statystyki dotyczące plików dziennika, które monitorujesz pod / var / tmp / logXray
- Opcja dziennika -ndshow – jest to parametr, którego chcesz użyć, jeśli chcesz wyprowadzić wpisy ze znalezionych dzienników pasujących do określonego wzorca (wzorców).Jeśli chcesz tylko zobaczyć całkowitą liczbę znalezionych wzorców, po prostu zamień „-ndshow” na „-ndfoundmul”.
Używając „-ndfoundmul”, „otrzymasz wynik podobne 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: Szukaj wielu ciągó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: To było testowane na Ubuntu i Red Hat
Odpowiedź
grep -EFn "fatal|error|critical|failure|warning|search-string" /path/to/the/file/log_file?.lo* --color=auto
Spowoduje to wyszukanie „krytycznego lub błędu lub krytycznego lub błędu, ostrzeżenia 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 wyszukiwanemu ciągowi losowy kolor i wypisz numer wiersza, w którym został znaleziony.
Komentarze
- Oczywiście, że to działająca odpowiedź, ale użytkownik poprosił o wyszukiwanie przy użyciu wzorzec, odpowiedziałeś, używając ustalonego ciągu wyszukiwania. Przepraszamy, ale dodanie rzeczy, o które nie pytano, takich jak numeracja linii i kolorowanie wyników, prawdopodobnie nie przyniesie bardziej korzystnej odpowiedzi. Ale pojawią się inne pytania, na które prawdopodobnie można znaleźć odpowiedzi na swoje
grep
umiejętności, więc życzymy powodzenia w karierze USE! - @zagrimsan punkt zajęty, ' dodałeś -E ' krytyczny | błąd | krytyczny | niepowodzenie | ostrzeżenie | ' param to it.
- I hej, konkretnie poprosił o wiele plików, a nie o wzorzec wyszukiwania. Przeczytaj ponownie pytanie.
- Cytuj z Q: ” wyszukaj określone ciągi „, a pytanie pokazuje wzorzec wyszukiwania (zawierający wiele ciągów do dopasowania), którego używa. Masz jednak rację, że tytuł pytania odbiega nieco od tego, o co tak naprawdę prosi. BTW,
-E
i-F
nie mogą być ' używane w tym samym czasie, są konflikt (literówka?).
Odpowiedź
JigarGandhi „odpowiedź pokazuje użycie symbolu wieloznacznego gwiazdki. Jest ich więcej i można je zobaczyć tutaj lub uruchamiając man 7 glob
.
Jednym z nich, który uważam za przydatny, jest dopasowanie zakresu z []
. Ponieważ system, nad którym pracuję, tworzy dziennik numerowany sekwencyjnie pliki, np. product.log.1
product.log.2
...
product.log.200
, przydaje się grep za pomocą jednego polecenia dla 3 lub 4 plików sekwencyjnych, ale nie więcej. Więc to
grep "whatever" product.log.[5-7]
spowoduje grep dla wszystkich plików kończących się na product.log. 5, 6 lub 7. Symbol wieloznaczny nie musi znajdować się na końcu, więc odpowiedź flickerfly ” można uprościć do
grep -E "fatal|error|critical|failure|warning" file[1,2].log
Zauważ również, że te symbole wieloznaczne mogą być używane w innych poleceniach, jak na przykład w cp
.
xargs
i możliwością poważnych uszkodzeń białych znaków w nazwach plików , gdy możesz po prostu użyćfind . -name '*.log' -exec grep -E 'fatal|error|critical|failure|warning' {} +
?