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
- Hvorfor gider med
xargs
og muligheden for alvorlig brud på det hvide område i filnavne når du kan bare brugefind . -name '*.log' -exec grep -E 'fatal|error|critical|failure|warning' {} +
?
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
- vedrørende egrep
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:
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:
- Logfilen eller logbogen, der skal overvåges
- 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
- De strenge / mønstre, du vil se efter
- Tagget – dette er det næstsidste argument, du skal levere. Det registrerer statistik om de logfiler, du overvåger under / var / tmp / logXray
- 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>