2

私は現在、" o' " に一致する文字列の Exim ログ ファイルを解析するための単純な .sh スクリプトを作成しています。現在、output.txt を表示すると、すべての行 (606 行) に 0 が出力されます。awk はエラーをスローしないため、私のロジックが間違っていると思います。

これが私のコードです(連結とカウンターの問題のために更新されました)。編集: dmckee の回答からいくつかの新しいコードを採用しました。これは、単純さを優先して古いコードよりも現在作業しています。

awk '/o'\''/ {
         line = "> ";
         for(i = 20; i <= 33; i++) {
           line = line " " $i;
         }
         print line;
    }' /var/log/exim/main.log > output.txt

何か案は?

編集: わかりやすくするために、メール アドレスの「o」を検索しています。これは、「」はメール アドレスでは無効な文字であるためです (データベースでは、o' がプレフィックスされた名前でのみ表示されます)。

編集 2: コメントの要求に従って、ここにいくつかの望ましい出力のサニタイズされたサンプルがあります:

[xxx.xxx.xxx.xxx] kathleen.o'toole@domain.com <kathleen.o'toole@domain.com> routing defer (-51): retry time not reached

[xxx.xxx.xxx.xxx] julie.o'brien@domain.com <julie.o'brien@domain.com> routing defer (-51): retry time not reached

[xxx.xxx.xxx.xxx] james.o'dell@domain.com <james.o'dell@domain.com> routing defer (-51): retry time not reached

[xxx.xxx.xxx.xxx] daniel_o'leary@domain.com <aniel_o'leary@domain.com> routing defer (-51): retry time not reached

ループで 20 から開始する理由は、20 番目のフィールドより前のすべてが標準のログ情報であり、ここでの目的には必要ないためです。このソリューションに必要なのは、IP とそれ以降のすべてです (各 550 エラーのメッセージは、使用されているメール サーバーごとに異なります。一般的なもののリストを編集しています)。

4

4 に答える 4

3

+awk の数値加算を意味します。連結したい場合は、定数や式をスペースで区切って配置してください。

したがって、この

line += " " + $i

なるべき

line = line " " $i

EDIT:eximログファイル(私はPostfixの方が好きです:)が単一のスペースで区切られている場合、次のほうが簡単ではありません:

grep -F o\' /var/log/exim/main.log | cut -d\  -f20-33 >output.txt

?

于 2008-10-01T20:02:50.950 に答える
2

ここでは grep は必要ありません。awkに一致する行を選択させます(そして、ΤΖΩΤΖΙΟΥに従って連結バグを修正します):

awk '/o'\''/ {
             line = "> ";
             for(i = 20; i <= 33; i++) {
               line = line " " $i;
             }
             print line;
        }' /var/log/exim/main.log > output.txt

もちろん、上記のようにプロンプ​​トで実行すると、奇妙なエスケープが必要になります。スクリプトでよりクリーンに...


編集:最初のパスで += 問題を見逃しました...

また、上記の行が部分的であると仮定すると、フィールドは 13 個しかないためです (デフォルトでは、フィールドは空白で区切られています)。

于 2008-10-01T20:17:17.860 に答える
1

"'" はローカル部分では違法ではありません。RFC2821、セクション 4.1.2から:

Local-part = Dot-string / Quoted-string

Dot-string = Atom *("." Atom)

Atom = 1*atext

2821 は、ローカルで定義されていない要素についてRFC2822をさらに参照しているため、次のようになります。

atext           =       ALPHA / DIGIT / ; Any character except controls,
                        "!" / "#" /     ;  SP, and specials.
                        "$" / "%" /     ;  Used for atoms
                        "&" / "'" /
                        "*" / "+" /
                        "-" / "/" /
                        "=" / "?" /
                        "^" / "_" /
                        "`" / "{" /
                        "|" / "}" /
                        "~"

言い換えれば、"'" は、電子メールのローカル部分に含めるのに完全に正当な引用符なしの文字です。さて、あなたのサイトでは合法ではないかもしれませんが、それはあなたが言ったことではありません.

トピックに直接とどまらず申し訳ありませんが、あなたの主張を修正したかったのです。

于 2008-10-01T20:30:42.867 に答える
1

オフタスクで、さらに簡単に: python.

import fileinput
for line in fileinput.input():
    if "'" in line:
        fields = line.split(' ')
        print "> ", ' '.join( fields[20:34] )
于 2008-10-01T21:01:22.403 に答える