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:

  1. Plik dziennika lub katalog dziennika do monitorowania
  2. 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
  3. Ciągi / wzorce, które chcesz obserwować
  4. Znacznik – jest to przedostatni argument, który musisz podać. Zapisuje statystyki dotyczące plików dziennika, które monitorujesz pod / var / tmp / logXray
  5. 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.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *