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
- Proč se obtěžovat
xargs
a možností vážného poškození mezer v názvech souborů , když stačí použítfind . -name '*.log' -exec grep -E 'fatal|error|critical|failure|warning' {} +
?
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
- týkající se egrep
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:
- Sledovaný soubor nebo adresář protokolu
- 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
- řetězce / vzory, které chcete sledovat
- Značka – toto je předposlední argument, který musíte zadat. Zaznamenává statistiky o souborech protokolu, které sledujete pod / var / tmp / logXray
- 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
.