Jeg har et sett med loggfiler som jeg trenger å gjennomgå, og jeg vil gjerne søke i bestemte strenger på de samme filene på en gang Er dette mulig? Foreløpig bruker jeg
grep -E "fatal|error|critical|failure|warning|" /path_to_file
Hvordan bruker jeg dette og søker etter strengene til flere filer samtidig? Hvis dette er noe som må skriptes, kan noen gi et enkelt skript for å gjøre dette?
Svar
grep -E "fatal|error|critical|failure|warning|" *.log
Kommentarer
- Hvordan får jeg
grep
til å hoppe over kataloger, men likevel sjekke rekursivt alle filer?grep -E 'text' **/*
fungerer, men gir en feilmelding for hver underkatalog (og sjekker deretter alle filene i dem riktig) - @Jorn, egentlig bør du stille et nytt spørsmål, men bruk
find . -type f -exec grep -E 'fatal|error|critical|failure|warning' {} +
- Jeg får
grep: invalid max count
, så jeg brukte jherrans svar
Svar
Du kan bruke noe sånt:
find . -name "*.log" | xargs grep -E "fatal|error|critical|failure|warning|"
Dette vil finn alle filer med .log
som utvidelse og bruk grep
kommandoen.
Kommentarer
- Hvorfor bry deg med
xargs
og muligheten for alvorlig brudd på hvitt mellomrom i filnavn når kan du bare brukefind . -name '*.log' -exec grep -E 'fatal|error|critical|failure|warning' {} +
?
Svar
Hvis det er enklere, kan du bare spesifisere hver fil etter hverandre.
grep -E "fatal|error|critical|failure|warning" file1.log file2.log
Svar
Hvis du trenger det å grep på et vilkårlig sett med filnavn som ikke kan hentes med et vanlig uttrykk:
grep -E "fatal|error|critical|failure|warning|" `cat<<FIN > file1 > file2 > ... > filen > FIN`
Hva er fordelen med å lime inn filnavnene etter hverandre? Du kan sammenstille filnavnlisten i en tekstfil og deretter lime den inn.
Svar
Du kan også bruke krøllete bukseseler hvis filene er alle den samme mappen.
Se et eksempel
grep -E "fatal|error|critical|failure|warning|" /var/log/{messages,secure,syslog,dmesg}
Hvis du legger til et s i grep, undertrykker dette feil om manglende filer
grep -sE "fatal|error|critical|failure|warning|" /var/log/{messages,secure,syslog,dmesg}
Jeg eksperimenterte bare med dette selv for å utføre kommandoer som fungerer på tvers av flere distros der det er i den ene filen mot den andre på grunn av OS-forskjeller.
E-postlogger
sudo grep -is [email protected] /var/log/{maillog,exim_mainlog,exim_rejectlog,mail.log,mail.err,syslog}
Arkiverte e-postlogger ved hjelp av 2> / dev / null for å 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
Referanse: Er det en måte å referere til flere filer i en katalog uten å skrive inn hele banen igjen?
Svar
Hvis du vil søke rekursivt i underkatalogfiler også Så kan du bruke kommandoen nedenfor
Den vil søke rekursivt i underkatalogfilen s også
egrep -r "string1|string2" pathname
Kommentarer
- angående egrep
Svar
Dette var en veldig tidkrevende oppgave. Og ja, det måtte absolutt skrives om du skulle søke etter flere strenger i flere forskjellige logger samtidig. Men jeg måtte nylig gjøre dette, og det var ganske smertefullt. Ikke desto mindre er det gjort og klart og kan lastes ned fra følgende lenke:
Slik dette fungerer er ganske enkelt.
Scenario 1: Overvåk EN streng i bare EN loggfil
./logsearch.sh localhost /var/tmp/logXray autonda /var/log/messages 60m "can.*t.*open" "." 1 2 single_errCheck -ndshow
Scenario 2: Overvåke FLERE strenger i bare 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: Overvåke enkle / flere strenger i flere loggfiler
./logsearch.sh localhost /var/tmp/logXray autonda /var/log 60m "can.*t.*open_P_ntpd.*stat" "." 1 2 multi_err_multi_logCheck -ndshow
Merknader:
_P_ betyr ELLER – Den erstatter røret «|» s ymbol fordi det er mindre sannsynlig at du «må søke etter en streng som inneholder» _P_ «. Hvis du ikke ønsker å skrive «_P_», kan du bare erstatte _P_ med «|».
Når du bruker dette skriptet, er parametrene du vil endre ofte:
- Loggfilen eller loggkatalogen som skal overvåkes
- Alderen en loggfil må være for at den skal overvåkes..no ikke overvåke eller oppdage noen loggfil som har en tidsstempel over 60 minutter
- Strengene / mønstrene du vil se etter
- Taggen – dette er det nest siste argumentet du må levere. Den registrerer statistikk om loggfilen (e) du overvåker under / var / tmp / logXray
- Loggalternativet -ndshow – Dette er parameteren du vil bruke hvis du ønsker å sende inn oppføringene fra loggene som er funnet som samsvarer med mønsteret / mønstrene du har angitt.Hvis du bare vil se det totale antallet mønstre som er funnet, er det bare å erstatte «-ndshow» med «-ndfoundmul».
Når du bruker «-ndfoundmul», vil du få en utdata lik:
[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å originalplakatens utgave: Søk etter flere strenger i flere 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
OSer: Dette ble 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øke etter «dødelig eller feil eller kritisk eller feil eller advarsel eller søkestreng» i filene med navnet som starter med «log_fil?» og utvidelse «lo » * i banen / bane / til / filen / og gi søkestrengen en tilfeldig farge og utskriftslinjenummer den ble funnet på.
Kommentarer
- Visst dette er et fungerende svar, men brukeren ba om å søke med en mønster, svarte du med en fast søkestreng. Beklager, men å legge til ting som ikke ble bedt om, som linjenummerering og farging av resultatene, vil sannsynligvis ikke gjøre svaret mer fordelaktig. Men det vil være andre spørsmål som sannsynligvis kan besvares
grep
ferdighetene dine så lykke til i din BRUK-karriere! - @zagrimsan poenget tatt, jeg ‘ har lagt til -E ‘ fatalt | feil | kritisk | feil | advarsel | ‘ param til det.
- Og hei, han ba spesielt om flere filer, ikke et søkemønster. Vennligst les spørsmålet igjen.
- Sitat fra Q: » søk etter spesifikke strenger «, og spørsmålet viser søkemønsteret (som inneholder flere strenger å matche for) han bruker. Du har rett i at tittelen på spørsmålet er litt av fra det han egentlig ber om. BTW,
-E
og-F
kan ‘ t brukes samtidig, de er motstridende (skrivefeil?).
Svar
JigarGandhi «svar viser bruken av jokertegnet. Det er flere av dem, og du kan se dem her eller ved å kjøre man 7 glob
.
En av dem som jeg syntes var nyttig er området som samsvarer med []
. Siden systemet jeg jobber med produserer sekvensielt nummerert logg filer f.eks. product.log.1
product.log.2
...
product.log.200
, det er praktisk å grep med en enkelt kommando på 3 eller 4 sekvensielle filer, men ikke mer. Så dette
grep "whatever" product.log.[5-7]
vil grep for alle filer som slutter med product.log. 5, 6 eller 7. Jokertegnet er ikke nødvendig for å være på slutten, så flickerfly «svar kan forenkles til
grep -E "fatal|error|critical|failure|warning" file[1,2].log
Legg også merke til at disse jokertegnene kan brukes i andre kommandoer, som for eksempel i cp
. p>