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

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

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:

Loggsökning Skript Ladda ner

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:

  1. Loggfilen eller loggkatalogen som ska övervakas
  2. Å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
  3. De strängar / mönster du vill titta på
  4. 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
  5. 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.

  • Och hej, han bad specifikt om flera filer, inte ett sökmönster. Vänligen läs frågan igen.
  • Citat från Q: ” sök specifika strängar ”, och frågan visar sökmönstret (som innehåller flera strängar att matcha) han använder. Du har rätt att titeln på frågan är något avstängd från vad han verkligen ber om. BTW, -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.

    Lämna ett svar

    Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *