Ik heb een reeks logbestanden die ik moet bekijken en ik zou graag in één keer naar specifieke strings in dezelfde bestanden zoeken. Is dit mogelijk? Momenteel gebruik ik
grep -E "fatal|error|critical|failure|warning|" /path_to_file
Hoe gebruik ik dit en zoek ik naar de strings van meerdere bestanden tegelijk? Als dit iets is dat moet worden gescript, kan iemand dan een eenvoudig script geven om dit te doen?
Antwoord
grep -E "fatal|error|critical|failure|warning|" *.log
Reacties
- Hoe krijg ik
grep
om mappen over te slaan, maar toch recursief alle bestanden?grep -E 'text' **/*
werkt, maar geeft een foutmelding voor elke subdirectory (en controleert dan correct alle bestanden erin) - @Jorn, je zou echt een nieuwe vraag moeten stellen, maar gebruik
find . -type f -exec grep -E 'fatal|error|critical|failure|warning' {} +
- Ik krijg
grep: invalid max count
, dus ik gebruikte jherrans antwoord
Answer
Je zou zoiets als dit kunnen gebruiken:
find . -name "*.log" | xargs grep -E "fatal|error|critical|failure|warning|"
Dit zal vind elk bestand met .log
als extensie en pas het grep
commando toe.
Opmerkingen
Antwoord
Als het eenvoudiger is, kunt u elk bestand achter elkaar specificeren.
grep -E "fatal|error|critical|failure|warning" file1.log file2.log
Answer
Als je nodig hebt om te grepen op een willekeurige set bestandsnamen die niet kunnen worden opgehaald door een reguliere expressie:
grep -E "fatal|error|critical|failure|warning|" `cat<<FIN > file1 > file2 > ... > filen > FIN`
Wat is het voordeel ten opzichte van het achter elkaar plakken van de bestandsnamen? U kunt de lijst met bestandsnamen in een tekstbestand samenstellen en deze vervolgens plakken.
Answer
U kunt ook accolades gebruiken als de bestanden zijn allemaal dezelfde map.
Zie een voorbeeld
grep -E "fatal|error|critical|failure|warning|" /var/log/{messages,secure,syslog,dmesg}
Als u een s aan de grep toevoegt, onderdrukt dit fouten over ontbrekende bestanden
grep -sE "fatal|error|critical|failure|warning|" /var/log/{messages,secure,syslog,dmesg}
Ik was hier zelf gewoon mee aan het experimenteren voor het uitvoeren van commandos die in meerdere distributies werken waar het in het ene bestand zit en het andere vanwege OS-verschillen.
E-maillogboeken
sudo grep -is [email protected] /var/log/{maillog,exim_mainlog,exim_rejectlog,mail.log,mail.err,syslog}
Gearchiveerde e-maillogboeken met 2> / dev / null om zgrep ontbrekende .gz-waarschuwingen te onderdrukken
sudo zgrep -is [email protected] /var/log/{maillog*,exim_mainlog*,exim_rejectlog*,mail.log*,mail.err*,syslog*} 2>/dev/null
Referentie: Is er een manier om naar meerdere bestanden in een map te verwijzen zonder het hele pad opnieuw te typen?
Antwoord
Als u ook recursief in bestanden van submappen wilt zoeken, dan kunt u het onderstaande commando gebruiken
Het zal recursief zoeken in het bestand met submappen s ook
egrep -r "string1|string2" pathname
Reacties
Antwoord
Dit was een zeer tijdrovende taak. En ja, het had zeker een script nodig als je naar meerdere strings in meerdere verschillende logboeken tegelijk gaat zoeken. Maar ik moest dit onlangs doen en het was best pijnlijk. Desalniettemin is het klaar en klaar en kan het worden gedownload via de volgende link:
De manier waarop dit werkt is vrij eenvoudig.
Scenario 1: Bewaak ÉÉN string in slechts ÉÉN logbestand
./logsearch.sh localhost /var/tmp/logXray autonda /var/log/messages 60m "can.*t.*open" "." 1 2 single_errCheck -ndshow
Scenario 2: Bewaak MEERDERE strings in slechts ÉÉN logbestand
./logsearch.sh localhost /var/tmp/logXray autonda /var/log/messages 60m "can.*t.*open_P_ntpd.*stat" "." 1 2 multi_errCheck -ndshow
Scenario 3: Monitor enkele / meerdere strings in meerdere logbestanden
./logsearch.sh localhost /var/tmp/logXray autonda /var/log 60m "can.*t.*open_P_ntpd.*stat" "." 1 2 multi_err_multi_logCheck -ndshow
Opmerkingen:
De _P_ betekent OF – Het vervangt de pijp “|” s ymbol omdat het minder waarschijnlijk is dat u “zult moeten zoeken naar een string die” _P_ “bevat. Als u “_P_” niet wilt typen, kunt u de _P_ vervangen door “|”.
Wanneer u dit script gebruikt, zijn de parameters die u regelmatig zult wijzigen:
- Het logbestand of de logboekdirectory die moet worden bewaakt
- De leeftijd er moet een logbestand zijn om het te kunnen bewaken. dwz controleer of ontdek geen logbestand met een tijdstempel van meer dan 60 minuten
- De strings (s) / patroon (en) waarnaar u wilt kijken
- De tag – dit is het op een na laatste argument dat u moet opgeven. Het registreert statistieken over de logfiles die u bewaakt onder / var / tmp / logXray
- De logoptie -ndshow – Dit is de parameter die u wilt gebruiken als u de invoer wilt uitvoeren uit de gevonden logboeken die overeenkomen met het patroon (de patronen) die u hebt opgegeven.Als je alleen het totale aantal van elk gevonden patroon wilt zien, vervang dan gewoon “-ndshow” door “-ndfoundmul”.
Wanneer je “-ndfoundmul” gebruikt, krijg je een output vergelijkbaar met:
[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)
Oplossing voor het probleem van de originele poster: Scannen naar meerdere strings in meerdere logbestanden
./logsearch.sh localhost /var/tmp/logXray autonda /var/log 60m "fatal_P_error_P_critical_P_failure_P_warning" "." 1 2 multierr_logCheck -ndshow
Besturingssystemen: Dit is getest op Ubuntu en Red Hat
Antwoord
grep -EFn "fatal|error|critical|failure|warning|search-string" /path/to/the/file/log_file?.lo* --color=auto
Hiermee wordt gezocht naar “fataal of fout of kritiek of fout of waarschuwing of zoekreeks” in de bestanden waarvan de naam begint met “log_file?” en extensie “lo ” * in het pad / pad / naar / het / bestand / en geef de zoekstring een willekeurige kleur en drukregelnummer waar hij werd gevonden.
Reacties
- Natuurlijk is dit een werkend antwoord, maar de gebruiker heeft gevraagd om te zoeken met een patroon, antwoordde u met een vaste zoekreeks. Sorry, maar het toevoegen van dingen waar niet om werd gevraagd, zoals de regelnummering en het inkleuren van resultaten, zal een antwoord waarschijnlijk niet gunstiger maken. Maar er zullen andere vragen zijn die waarschijnlijk beantwoord kunnen worden met uw
grep
vaardigheden, dus veel succes met uw USE-carrière! - @zagrimsan punt genomen, ik ‘ heb de -E ‘ fatale | fout | kritiek | fout | waarschuwing | ‘ parameter.
- En hey, hij vroeg specifiek om meerdere bestanden, niet om een zoekpatroon. Lees de vraag opnieuw.
- Citaat uit de Q: ” zoek specifieke strings “, en de vraag wordt weergegeven het zoekpatroon (met meerdere strings om mee te matchen) dat hij gebruikt. Je hebt echter gelijk dat de titel van de vraag enigszins afwijkt van wat hij werkelijk vraagt. Tussen haakjes,
-E
en-F
kunnen ‘ niet tegelijkertijd worden gebruikt, ze zijn conflicterend (typefout?).
Antwoord
JigarGandhi “s antwoord toont het gebruik van het asterisk-jokerteken aan. Er zijn er meer en u kunt ze hier zien of door .
Een daarvan die ik nuttig vond, is het bereik dat overeenkomt met []
. Aangezien het systeem waaraan ik werk een opeenvolgend genummerd logboek produceert bestanden, bijv. product.log.1
product.log.2
...
product.log.200
, is het handig om met een enkele opdracht te grepen op 3 of 4 opeenvolgende bestanden, maar niet meer. Dus dit
grep "whatever" product.log.[5-7]
zal grepen voor alle bestanden die eindigen op product.log. 5, 6 of 7. Het jokerteken hoeft niet aan het einde te staan, dus flickerfly “s antwoord kan worden vereenvoudigd tot
grep -E "fatal|error|critical|failure|warning" file[1,2].log
Merk ook op dat deze jokertekens ook in andere commandos kunnen worden gebruikt, zoals in cp
bijvoorbeeld.
xargs
en de mogelijkheid voor ernstige breuk in witruimte in bestandsnamen wanneer je kunt gewoonfind . -name '*.log' -exec grep -E 'fatal|error|critical|failure|warning' {} +
gebruiken?