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:

Logboekzoekscript downloaden

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:

  1. Het logbestand of de logboekdirectory die moet worden bewaakt
  2. 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
  3. De strings (s) / patroon (en) waarnaar u wilt kijken
  4. 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
  5. 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.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *