一致する前の単語を見つける方法

一致する前の単語を見つける方法

次のログ ファイルがあります。シェル スクリプトを使用して、障害や疑わしい状態があるかどうかを知る必要があります。

誤りを見つけて前の単語をチェックする必要があります。それが 0 より大きい場合は、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.

Linux/Bash シェルで次のコマンドをすでに試しましたが、うまく動作しています。

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

しかし、AIXサーバーで同じことを実行するとエラーが発生します

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...]

答え1

X faults2 つの文字列のいずれかが、Y suspect正の整数値でXYに等しくない場合に0、ファイル内に存在する場合に何かを実行したいとします$MAILLOG

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

このパターンは、([1-9]|[0-9]{2,})ゼロより大きい 1 桁の数字、または 2 桁以上の数字のいずれかに一致します。

パターンは(faults|suspect)文字列faultsまたはのいずれかに一致します。そこにもsuspect含める場合は、 を使用します。checks(faults|suspect|checks)

オプション-qは、grepユーティリティが生成するエラー以外の出力をすべてオフにします (ここでgrepは、 の終了ステータス、つまりパターンに一致できたかどうかのみに関心があります)。

オプション-wgrep「単語検索」を実行します。この場合、のゼロは新しい「単語」を開始しませんが、 は開始するため、部分文字10 faults列ではなく部分文字列が検索されることを意味します。また、文字列 (その文字列がいかにありそうにないとしても) は一致をトリガーしないことを意味します。0 faults1012 faultsmen

-E代替 ( ) を使用した拡張正規表現をサポートするには が必要です|

答え2

grep を使ってみることもできます:

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

例えば:

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

関連情報