質問

現在、"に一致する文字列についてEximログファイルを解析する簡単な.shスクリプトを作成しています。 o '"。現在、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」をgrepします電子メールアドレスでは、 'は電子メールアドレスでは無効な文字であるため(およびデータベースでは、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エラーごとのメッセージは、使用中のメールサーバーごとに異なります。一般的なもののリストをコンパイルしています)

役に立ちましたか?

解決

ここでgrepを実際に使用する必要はありません。 awkで一致する行を選択します(および&#932;&#918;&#937;&#932;&#918;&#921;&#927;&#933;に従って連結バグを修正します)。

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

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


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

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

他のヒント

+ は、awkでの数値の加算を意味します。連結する場合は、スペースで区切られた定数や式を配置するだけです。

だから、これ

line += " " + $i

なるはず

line = line " " $i

編集: Iff eximログファイル(私はPostfixの方が好きです)は単一のスペースで区切られていますが、次のように単純ではありません:

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

&quot; '&quot;ローカル部分では違法ではありません。 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.
                        "<*>quot; / "%" /     ;  Used for atoms
                        "&" / "'" /
                        "*" / "+" /
                        "-" / "/" /
                        "=" / "?" /
                        "^" / "_" /
                        "`" / "{" /
                        "|" / "}" /
                        "~"

つまり、&quot; '&quot;は、メールのローカル部分に含まれる、完全に合法的な引用符なしの特性です。さて、それはあなたのサイトで合法ではないかもしれませんが、それはあなたが言ったことではありません。

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

タスクをオフに、さらにシンプルに:python。

import fileinput
for line in fileinput.input():
    if "'" in line:
        fields = line.split(' ')
        print "> ", ' '.join( fields[20:34] )
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top