質問
現在、"に一致する文字列について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] )