Jag har en uppsättning loggfiler som jag behöver granska och jag vill söka efter specifika strängar på samma filer på en gång. Är det möjligt? För närvarande använder jag
grep -E "fatal|error|critical|failure|warning|" /path_to_file
Hur använder jag det här och söker efter strängarna i flera filer samtidigt? Om det här är något som behöver skrivas, kan någon tillhandahålla ett enkelt skript för att göra detta?
Svar
grep -E "fatal|error|critical|failure|warning|" *.log
Kommentarer
- Hur får jag
grep
att hoppa över kataloger, men ändå rekursivt kontrollera alla filer?grep -E 'text' **/*
fungerar, men ger ett felmeddelande för varje underkatalog (och kontrollerar sedan korrekt alla filer i dem) - @Jorn, verkligen borde du ställa en ny fråga, men använd
find . -type f -exec grep -E 'fatal|error|critical|failure|warning' {} +
- Jag får
grep: invalid max count
, så jag använde jherrans svar
Svar
Du kan använda något så här:
find . -name "*.log" | xargs grep -E "fatal|error|critical|failure|warning|"
Detta kommer att hitta alla filer med .log
som tillägg och tillämpa grep
kommandot.
Kommentarer
- Varför bry sig om
xargs
och möjligheten för allvarliga brott i det vita utrymmet i filnamn när du kan bara användafind . -name '*.log' -exec grep -E 'fatal|error|critical|failure|warning' {} +
?
Svar
Om det är enklare, du kan bara ange varje fil efter varandra.
grep -E "fatal|error|critical|failure|warning" file1.log file2.log
Svar
Om du behöver att grep på en godtycklig uppsättning filnamn som inte kan hämtas med ett vanligt uttryck:
grep -E "fatal|error|critical|failure|warning|" `cat<<FIN > file1 > file2 > ... > filen > FIN`
Vilken är fördelen att klistra in filnamnen efter varandra? Du kan sammanställa filnamnslistan i en textfil och sedan klistra in den.
Svar
Du kan också använda lockiga hakparenteser om filerna är alla samma mapp.
Se ett exempel
grep -E "fatal|error|critical|failure|warning|" /var/log/{messages,secure,syslog,dmesg}
Om du lägger till ett s i grep så undertrycker detta fel om att det saknas filer
grep -sE "fatal|error|critical|failure|warning|" /var/log/{messages,secure,syslog,dmesg}
Jag experimenterade just med detta själv för att göra kommandon som fungerar över flera distros där det finns i en fil mot den andra på grund av OS-skillnader.
E-postloggar
sudo grep -is [email protected] /var/log/{maillog,exim_mainlog,exim_rejectlog,mail.log,mail.err,syslog}
Arkiverade e-postloggar med 2> / dev / null för att undertrycka zgrep saknas .gz-varningar
sudo zgrep -is [email protected] /var/log/{maillog*,exim_mainlog*,exim_rejectlog*,mail.log*,mail.err*,syslog*} 2>/dev/null
Referens: Finns det ett sätt att hänvisa till flera filer i en katalog utan att skriva om hela sökvägen?
Svar
Om du vill söka rekursivt i underkatalogfiler också kan du använda kommandot nedan
Den söker rekursivt i underkatalogens fil s också
egrep -r "string1|string2" pathname
Kommentarer
- angående egrep
Svar
Detta var en mycket tidskrävande uppgift. Och ja, det måste verkligen skrivas om du ska söka efter flera strängar i flera olika loggar samtidigt. Men jag var nyligen tvungen att göra detta och det var ganska smärtsamt. Ändå är det gjort och klart och kan laddas ner från följande länk:
Så här fungerar det är ganska enkelt.
Scenario 1: Övervaka EN sträng i bara EN loggfil
./logsearch.sh localhost /var/tmp/logXray autonda /var/log/messages 60m "can.*t.*open" "." 1 2 single_errCheck -ndshow
Scenario 2: Övervaka FLERA strängar i bara EN loggfil
./logsearch.sh localhost /var/tmp/logXray autonda /var/log/messages 60m "can.*t.*open_P_ntpd.*stat" "." 1 2 multi_errCheck -ndshow
Scenario 3: Övervaka enstaka / flera strängar i flera loggfiler
./logsearch.sh localhost /var/tmp/logXray autonda /var/log 60m "can.*t.*open_P_ntpd.*stat" "." 1 2 multi_err_multi_logCheck -ndshow
Anmärkningar:
_P_ betyder ELLER – Det ersätter röret ”|” s ymbol eftersom det är mindre troligt att du ”måste söka efter en sträng som innehåller” _P_ ”. Om du inte vill skriva ”_P_” kan du bara ersätta _P_ med ”|”.
När du använder detta skript är parametrarna som du ändrar ofta:
- Loggfilen eller loggkatalogen som ska övervakas
- Åldern en loggfil måste vara för att den ska kunna övervakas..de ska inte övervaka eller upptäcka någon loggfil som har en tidsstämpel över 60 minuter
- De strängar / mönster du vill titta på
- Taggen – detta är det näst sista argumentet du måste ange. Den registrerar statistik om de loggfiler som du övervakar under / var / tmp / logXray
- Loggalternativet -ndshow – Det här är parametern du vill använda om du vill mata ut posterna från de loggar som hittades som matchar det mönster du angett.Om du bara vill se det totala antalet som hittats, ersätt helt enkelt ”-ndshow” med ”-ndfoundmul”.
När du använder ”-ndfoundmul” får du en utdata liknande:
[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)
Lösning på originalaffischens utgåva: Sök efter flera strängar i flera loggfiler
./logsearch.sh localhost /var/tmp/logXray autonda /var/log 60m "fatal_P_error_P_critical_P_failure_P_warning" "." 1 2 multierr_logCheck -ndshow
OS: Detta testades på Ubuntu och Red Hat
Svar
grep -EFn "fatal|error|critical|failure|warning|search-string" /path/to/the/file/log_file?.lo* --color=auto
Detta kommer att söka efter ”dödligt eller fel eller kritiskt eller fel eller varning eller söksträng” i filerna med namnet som börjar med ”log_fil?” och tillägg ”lo ” * i sökvägen / sökväg / till / filen / och ge söksträngen ett slumpmässigt färg- och utskriftsradenummer som den hittades på.
Kommentarer
- Visst är detta ett fungerande svar, men användaren bad om att söka med en mönster, svarade du med en fast söksträng. Tyvärr, men att lägga till saker som inte var efterfrågade, som radnumrering och färgläggning av resultat, kommer sannolikt inte att göra ett svar mer fördelaktigt. Men det kommer att finnas andra frågor som sannolikt kan besvaras dina
grep
färdigheter så lycka till i din ANVÄNDNING karriär! = ”063c81ad8e”>
har lagt till -E ’ dödligt | fel | kritiskt | fel | varning | ’ param till det.
-E
och -F
kan ’ inte användas samtidigt, de används motstridigt (skrivfel?). Svar
JigarGandhi ”svar visar användningen av asterisk jokertecken. Det finns fler av dem och du kan se dem här eller genom att köra man 7 glob
.
En av dem som jag tyckte var användbar är intervallet som matchar med []
. Eftersom systemet jag arbetar med producerar sekventiellt numrerad logg filer t.ex. product.log.1
product.log.2
...
product.log.200
, det är praktiskt att grep med ett enda kommando på 3 eller 4 sekventiella filer men inte mer. Så
grep "whatever" product.log.[5-7]
kommer att gälla alla filer som slutar med product.log. 5, 6 eller 7. Jokertecknet är inte nödvändigt för att vara i slutet så flickerfly ”svar kan förenklas till
grep -E "fatal|error|critical|failure|warning" file[1,2].log
Observera också att dessa jokertecken kan användas i andra kommandon liksom i cp
till exempel.