1

-f、-i、および -v オプションを指定して grep を使用したいと考えています。次の内容のパターン ファイルがあります。

vchkpw-pop3
vchkpw-送信
user_unknown
unknown_user
address_rejected
no_
such_user does_not_exist
invalid_recipient
mailbox_unavailable
user_not_found
no_mailbox_here

そして、qmail メールのログ ファイルを処理しているときに、上記の用語をすべて除外したいと考えています。

Grep 2.5.1 を使用すると、3 番目の位置から始まるどのパターンでも機能しないようです。

メールログ ファイルを解析するために、1 行の bash コードを使用しています。以下の行を参照してください。

cat /var/log/maillog | tai64n2tai | awk '{$1="";$2="";$3="";$4="";$5="";print}'
| grep -v vchkpw-pop3 | grep -v vchkpw-submission | awk '{sub(/^[ \t]+/,"")};1'
| qlogselect start $STARTDAY end $ENDDAY | matchup > $QMAILSTATS 5>/dev/null

パイプで複数の grep -v "sometext" を使用する代わりに、代わりに grep -vif patterns.txt を使用したかったのです。

ただし、私の問題は、私のバージョンの grep では、パターンにアンダースコア (_) が含まれている場合、f オプションと i オプションを一緒に使用できないことです。アンダースコアを削除すると、パターンは期待どおりに一致します。

メールログを解析するときに省略したい行の例を次に示します。

Sep 20 15:46:50 m qmail: 1348123610.323831 delivery 11150428: failure: 204.119.19.51_does_not_like_recipient./Remote_host_said:_550_5.1.1_User_unknown/Giving_up_on_204.119.19.51./ 

エラー メッセージは、接続しているメール サーバーに依存するため、パターン user_unknown に大文字が含まれている場合と含まれていない場合があります。

誰もがより良い解決策を持っていますか?

1行のbashコマンドを毎回編集する必要がなく、ファイルからパターンを追加/削除するだけでよいというアイデアが気に入っています。

4

1 に答える 1

0

GNU awkパターンが。というファイルに保存されていると仮定して、を使用する1つの方法を次に示しますpatterns.txt。これはの内容ですscript.awk

BEGIN {
    IGNORECASE=1
}

FNR==NR {
    patterns[$0]++
    counter++
    next
}

{
    $1=$2=$3=$4=$5=""
    sub(/^[ \t]+/,"")

    for (i in patterns) {
        if ($0 !~ i) {
            count++
        }
    }

    if (counter == count \
        && !/^$/) {
            print
    }

    count = 0
}

このように実行します:

< /var/log/maillog | tai64n2tai | awk -f script.awk patterns.txt - | qlogselect start $STARTDAY end $ENDDAY | matchup > $QMAILSTATS 5>/dev/null

または、スクリプトを使用したくない場合は、次の1つのライナーが役立ちます。

< /var/log/maillog | tai64n2tai | awk 'BEGIN { IGNORECASE=1 } FNR==NR { patterns[$0]++; counter++; next } { $1=$2=$3=$4=$5=""; sub(/^[ \t]+/,""); for (i in patterns) { if ($0 !~ i) { count++ } } if (counter == count && !/^$/) { print } count = 0 }' patterns.txt - | qlogselect start $STARTDAY end $ENDDAY | matchup > $QMAILSTATS 5>/dev/null
于 2012-09-20T14:11:27.060 に答える