
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 faults
und Y suspect
alle positiven ganzzahligen Werte X
ungleich in der Datei vorhanden Y
sind .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 faults
oder übereinstimmen suspect
. Möchten Sie checks
dort auch einschließen, verwenden Sie einfach (faults|suspect|checks)
.
Mit dieser -q
Option können Sie grep
alle 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 -w
Option führt grep
eine „Wortsuche“ durch. In diesem Fall bedeutet dies, dass 10 faults
nicht die Teilzeichenfolge gefunden wird 0 faults
, da die Null in 10
kein neues „Wort“ beginnt, sondern die 1
in . Es bedeutet auch, dass die Zeichenfolge 2 faultsmen
(wie unwahrscheinlich diese Zeichenfolge auch sein mag) keine Übereinstimmung auslösen würde.
Dies -E
wird 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