Mám sadu souborů protokolu, které musím zkontrolovat, a chtěl bych vyhledat konkrétní řetězce ve stejných souborech najednou Je to možné? V současné době používám

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

Jak to mohu použít a vyhledat řetězce více souborů najednou? Pokud je to něco, co je třeba skriptovat, může někdo poskytnout jednoduchý skript, jak to udělat?

Odpovědět

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

Komentáře

  • Jak mohu grep přeskočit adresáře, ale stále rekurzivně zkontrolovat všechny soubory? grep -E 'text' **/* funguje, ale zobrazí chybovou zprávu pro každý podadresář (a poté správně zkontroluje všechny soubory v nich)
  • @Jorn, opravdu byste se měli zeptat na novou otázku, ale použijte find . -type f -exec grep -E 'fatal|error|critical|failure|warning' {} +
  • dostanu grep: invalid max count, takže jsem použil odpověď jherrans

Odpověď

Můžete použít něco takového:

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

Toto bude najděte každý soubor s příponou .log a použijte příkaz grep.

Komentáře

odpověď

Pokud ano je jednodušší, stačí zadat jeden po druhém.

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

Odpovědět

Pokud potřebujete grep na libovolnou sadu názvů souborů, které nelze získat regulárním výrazem:

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

Jaká je výhoda oproti vkládání názvů souborů jeden po druhém? Seznam názvů souborů můžete zkompilovat do textového souboru a poté jej vložit.

Odpovědět

Můžete také použít složené závorky, pokud soubory jsou všechny ve stejné složce.

Viz příklad

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

Pokud do grepu přidáte znak s, potlačí chyby o chybějící soubory

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

Sám jsem s tím jen experimentoval, že dělám příkazy, které fungují napříč několika distribucemi, kde je to v jednom souboru oproti druhému kvůli rozdílům v OS.

Protokoly pošty

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

Archivované protokoly pošty pomocí 2> / dev / null k potlačení chybějících zgrep varování .gz

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

Odkaz: Existuje způsob, jak odkazovat na více souborů v adresáři bez přepsání celé cesty?

Odpověď

Pokud chcete rekurzivně vyhledávat také v souborech podadresářů, můžete použít následující příkaz

Prohledá rekurzivně v souboru podadresářů s také

egrep -r "string1|string2" pathname 

Komentáře

Odpověď

Byl to časově velmi náročný úkol. A ano, určitě to musíte skriptovat, pokud se chystáte hledat více řetězců ve více různých protokolech současně. Nedávno jsem to ale musel udělat a bylo to docela bolestivé. Přesto je to hotové a připravené a může lze stáhnout z následujícího odkazu:

Stažení skriptu pro vyhledávání protokolu

Způsob, jakým to funguje, je velmi jednoduchý.

Scénář 1: Monitorovat JEDEN řetězec pouze v JEDNOM souboru protokolu

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

Scénář 2: Monitorovat VÍCENÁSOBNÉ řetězce pouze v JEDNOM souboru protokolu

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

Scénář 3: Monitorovat jednotlivé / více řetězců ve více souborech protokolu

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

Poznámky:

_P_ znamená OR – nahradí rouru „|“ s ymbol, protože je méně pravděpodobné, že budete muset hledat řetězec obsahující „_P_“. Pokud si nepřejete psát „_P_“, můžete místo _P_ nahradit „|“.

Při použití tohoto skriptu jsou parametry, které často měníte, tyto:

  1. Sledovaný soubor nebo adresář protokolu
  2. Věk soubor protokolu musí být, aby mohl být monitorován. nemonitorujte ani neobjevujte žádný soubor protokolu, který má časové razítko více než 60 minut
  3. řetězce / vzory, které chcete sledovat
  4. Značka – toto je předposlední argument, který musíte zadat. Zaznamenává statistiky o souborech protokolu, které sledujete pod / var / tmp / logXray
  5. Možnost protokolu -ndshow – Toto je parametr, který chcete použít, pokud si přejete odeslat záznamy z nalezených protokolů, které odpovídají zadaným vzorům.Pokud chcete pouze zobrazit celkový počet nalezených vzorů, jednoduše nahraďte řetězec „-ndshow“ řetězcem „-ndfoundmul“.

Při použití příkazu „-ndfoundmul“ získáte výstup podobné:

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

Řešení problému s originálním plakátem: Vyhledat více řetězců v několika souborech protokolu

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

Operační systémy: Toto bylo testováno na Ubuntu a Red Hat

Odpověď

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

Tím se vyhledá „fatální nebo chyba nebo kritické nebo selhání nebo varování nebo vyhledávací řetězec“ v souborech s názvem začínajícím „log_file?“ a příponu „lo “ * v cestě / path / to / the / file / a přiřadit vyhledávanému řetězci náhodnou barvu a číslo tiskového řádku, na kterém bylo nalezeno.

Komentáře

  • Jistě, toto je funkční odpověď, ale uživatel požádal o vyhledávání pomocí vzor, odpověděli jste pomocí pevného vyhledávacího řetězce. Je nám líto, ale přidání věcí, které nebyly požadovány, jako je číslování řádků a vybarvení výsledků, pravděpodobně nezvýší užitečnost odpovědi. Ale budou existovat i další otázky, na které bude pravděpodobně možné odpovědět na vaše grep dovednosti, takže hodně štěstí ve vaší USE kariéře!
  • @zagrimsan vzato, I ‚ přidal jsem -E ‚ fatální | chyba | kritická | porucha | varování | ‚ parametr.
  • A hej, konkrétně požadoval více souborů, ne vyhledávací vzorec. Přečtěte si prosím otázku znovu.
  • Citát z dotazu Q: “ vyhledejte konkrétní řetězce “ a otázka se zobrazí vyhledávací vzor (obsahující více odpovídajících řetězců), který používá. Máte pravdu, že název otázky je mírně odlišný od toho, o co ve skutečnosti žádá. BTW, -E a -F nelze ‚ použít současně, jsou konfliktní (překlep?).

Odpověď

JigarGandhi „Odpověď ukazuje použití zástupného znaku hvězdičky. Je jich více a můžete je zobrazit zde nebo spuštěním man 7 glob.

Jedním z nich, který mi připadal užitečný, je shoda rozsahu s []. Protože systém, na kterém pracuji, produkuje sekvenčně číslovaný protokol soubory např. product.log.1 product.log.2 ... product.log.200 , je užitečné grep s jediným příkazem na 3 nebo 4 sekvenční soubory, ale ne více. Toto

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

bude tedy grep pro všechny soubory končící na product.log. 5, 6 nebo 7. Zástupný znak nemusí být na konci, takže flickerfly „s odpovědí lze zjednodušit na

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

Upozorňujeme, že tyto zástupné znaky lze použít i v jiných příkazech, například v cp.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *