So finden Sie das Wort vor einer Übereinstimmung

So finden Sie das Wort vor einer Übereinstimmung

Ich habe die folgende Protokolldatei. Ich muss wissen, ob bei der Verwendung eines Shell-Skripts ein Fehler/verdächtiger Zustand vorliegt.

Ich muss den Fehler finden und das vorherige Wort überprüfen. Wenn es größer als 0 ist, gibt es Arbeit für den DBA.

Checking pubs2: Logical pagesize is 4096 bytes
DBCC CHECKSTORAGE for database 'pubs2' sequence 17 completed at Oct 21 2015  3:17PM. 4 faults and 0 suspect conditions were located. 0 checks were aborted. You should investigate the recorded faults, and plan a course of action that will correct them.

Ich habe die folgenden Befehle bereits in der Linux/Bash-Shell ausprobiert und sie funktionieren gut.

FLTCNT=`cat $MAILLOG | grep -oP '\S+(?=\s+faults and)'`
SPTCNT=`cat $MAILLOG | grep -oP '\S+(?=\s+suspect)'`

if [ $FLTCNT -gt 0 ] || [ $SPTCNT -gt 0 ] ; then
    FAILED="Y"
#   echo "Fault / suspect conditions found"
    cat $MAILLOG >> $ERRLOG
fi

Aber wenn ich dasselbe auf einem AIX-Server ausführe, erhalte ich eine Fehlermeldung

grep: illegal option -- o
grep: illegal option -- P
usage: grep [-r] [-R] [-H] [-L] [-E|-F] [-c|-l|-q] [-insvxbhwyu] [-p[parasep]] -e pattern_list...
    [-f pattern_file...] [file...]
usage: grep [-E|-F] [-c|-l|-q] [-insvxbhwyu] [-p[parasep]] [-e pattern_list...]
    -f pattern_file... [file...]

Antwort1

Angenommen, Sie möchten etwas tun, wenn einer der beiden Strings X faultsund Y suspectalle positiven ganzzahligen Werte Xungleich in der Datei vorhanden Ysind .0$MAILLOG

if grep -qwE '([1-9]|[0-9]{2,}) (faults|suspect)' "$MAILLOG"; then
    # do something
fi

Das Muster ([1-9]|[0-9]{2,})würde entweder mit einer einzelnen Ziffer größer als Null oder mit jeder Zahl mit zwei oder mehr Ziffern übereinstimmen.

Das Muster (faults|suspect)würde entweder mit der Zeichenfolge faultsoder übereinstimmen suspect. Möchten Sie checksdort auch einschließen, verwenden Sie einfach (faults|suspect|checks).

Mit dieser -qOption können Sie grepalle fehlerfreien Ausgaben deaktivieren, die das Dienstprogramm sonst erzeugen würde (uns interessiert nur der Beendigungsstatus von grep, d. h. ob das Muster abgeglichen werden konnte oder nicht).

Die -wOption führt grepeine „Wortsuche“ durch. In diesem Fall bedeutet dies, dass 10 faultsnicht die Teilzeichenfolge gefunden wird 0 faults, da die Null in 10kein neues „Wort“ beginnt, sondern die 1in . Es bedeutet auch, dass die Zeichenfolge 2 faultsmen(wie unwahrscheinlich diese Zeichenfolge auch sein mag) keine Übereinstimmung auslösen würde.

Dies -Ewird benötigt, um erweiterte reguläre Ausdrücke mit Alternation ( |) zu unterstützen.

Antwort2

Sie könnten es mit grep versuchen:

grep -c "your word to match" /log/file

Z.B:

$ grep -c "upgraded" /var/log/pacman.log 
244

verwandte Informationen