Jeg har et sæt logfiler, som jeg har brug for at gennemgå, og jeg vil gerne søge i specifikke strenge på de samme filer på én gang Er dette muligt? I øjeblikket bruger jeg

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

Hvordan bruger jeg dette og søger efter strengene i flere filer på én gang? Hvis dette er noget, der skal scriptes, kan nogen give et simpelt script til at gøre dette?

Svar

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

Kommentarer

  • Hvordan får jeg grep til at springe mapper over, men stadig rekursivt kontrollere alle filer? grep -E 'text' **/* fungerer, men giver en fejlmeddelelse for hver underkatalog (og kontrollerer derefter korrekt alle filer i dem)
  • @Jorn, virkelig skal du stille et nyt spørgsmål, men brug find . -type f -exec grep -E 'fatal|error|critical|failure|warning' {} +
  • Jeg får grep: invalid max count, så jeg brugte jherrans svar

Svar

Du kan bruge noget som dette:

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

Dette vil find hver fil med .log som udvidelse og anvend kommandoen grep.

Kommentarer

Svar

Hvis det er enklere, du kan bare angive hver fil efter hinanden.

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

Svar

Hvis du har brug for det at grep på et vilkårligt sæt filnavne, der ikke kan hentes med et regulært udtryk:

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

Hvad er fordelen ved at indsætte filnavnene efter hinanden? Du kan sammensætte listen over filnavne på en tekstfil og derefter indsætte den.

Svar

Du kan også bruge krøllede parenteser, hvis filerne er alle de samme mapper.

Se et eksempel

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

Hvis du tilføjer et s til grep, undertrykker dette fejl om manglende filer

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

Jeg eksperimenterede bare med dette selv for at udføre kommandoer, der fungerer på tværs af flere distroer, hvor det er i den ene fil mod den anden på grund af OS-forskelle.

Maillogfiler

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

Arkiverede maillogfiler ved hjælp af 2> / dev / null til at undertrykke zgrep mangler .gz-advarsler

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

Reference: Er der en måde at henvise til flere filer i en mappe uden at indtaste hele stien igen?

Svar

Hvis du også vil søge rekursivt i underkatalogfiler, så kan du bruge kommandoen nedenfor

Det søger rekursivt i underkatalogfilen s også

egrep -r "string1|string2" pathname 

Kommentarer

Svar

Dette var en meget tidskrævende opgave. Og ja, det skulle bestemt være scriptet, hvis du skulle søge efter flere strenge i flere forskellige logfiler på samme tid. Men jeg måtte for nylig gøre dette, og det var ret smertefuldt. Ikke desto mindre er det gjort og klar og kan downloades fra følgende link:

Logsøgnings script Download

Sådan fungerer det, er ret simpelt.

Scenarie 1: Overvåg EN streng i kun EN logfil

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

Scenarie 2: Overvåg FLERE strenge i kun EN logfil

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

Scenarie 3: Overvåg enkelt / flere strenge i flere logfiler

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

Bemærkninger:

_P_ betyder ELLER – Det erstatter røret “|” s ymbol fordi det er mindre sandsynligt, at du “bliver nødt til at søge efter en streng, der indeholder” _P_ “. Hvis du ikke ønsker at skrive “_P_”, kan du bare erstatte _P_ med “|”.

Når du bruger dette script, er de parametre, du vil ændre ofte:

  1. Logfilen eller logbogen, der skal overvåges
  2. Alderen en logfil skal være for at den kan overvåges..de må ikke overvåge eller opdage nogen logfil, der har et tidsstempel over 60 minutter
  3. De strenge / mønstre, du vil se efter
  4. Tagget – dette er det næstsidste argument, du skal levere. Det registrerer statistik om de logfiler, du overvåger under / var / tmp / logXray
  5. Log-indstillingen -ndshow – Dette er den parameter, du vil bruge, hvis du ønsker at sende indgangene fra de fundne logfiler, der matcher det eller de mønstre, du har angivet.Hvis du bare vil se den samlede optælling af hvert fundet mønster, skal du blot erstatte “-ndshow” med “-ndfoundmul”.

Når du bruger “-ndfoundmul”, får du en output svarer til:

[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 til den originale plakats udgave: Scan efter flere strenge i flere logfiler

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

OSer: Dette blev testet på Ubuntu og Red Hat

Svar

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

Dette vil søge efter “fatal eller fejl eller kritisk eller fiasko eller advarsel eller søgestreng” i filerne med navnet startende med “log_file?” og udvidelse “lo ” * i stien / sti / til / filen / og giv søgestrengen en tilfældig farve- og printlinjenummer, den blev fundet på.

Kommentarer

  • Sikker på, at dette er et fungerende svar, men brugeren bad om at søge ved hjælp af en mønster, svarede du ved hjælp af en fast søgestreng. Beklager, men tilføjelse af ting, der ikke blev bedt om, som linjenummerering og farvning af resultater, vil sandsynligvis ikke gøre et svar mere fordelagtigt. Men der vil være andre spørgsmål, som sandsynligvis kan besvares dine grep færdigheder, så held og lykke med din brug af karriere!
  • @zagrimsan taget, jeg ‘ har tilføjet -E ‘ fatal | fejl | kritisk | fejl | advarsel | ‘ param til det.
  • Og hej, han bad specifikt om flere filer, ikke et søgemønster. Læs spørgsmålet igen.
  • Citat fra Q: ” søg specifikke strenge “, og spørgsmålet viser det søgemønster (der indeholder flere strenge, der passer til), han bruger. Du har ret i, at titlen på spørgsmålet er lidt fra, hvad han virkelig beder om. BTW, -E og -F kan ‘ ikke bruges på samme tid, de er modstridende (skrivefejl?).

Svar

JigarGandhi “s svar demonstrerer brugen af asterisk wildcard. Der er flere af dem, og du kan se dem her eller ved at køre man 7 glob.

En af dem, som jeg fandt nyttige, er det område, der matcher med []. Da systemet, jeg arbejder på, producerer sekventielt nummereret log filer f.eks. product.log.1 product.log.2 ... product.log.200 , det er praktisk at grep med en enkelt kommando på 3 eller 4 sekventielle filer, men ikke mere. Så dette

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

vil grep for alle filer, der slutter med product.log. 5, 6 eller 7. Jokertegnet er ikke nødvendigt for at være i slutningen, så flickerflys svar kan forenkles til

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

Bemærk også, at disse jokertegn også kan bruges i andre kommandoer som f.eks. i cp. p>

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *