会話を開始したクライアントに基づいて、Postfixログファイルから会話を抽出しようとしています。これは、一致するメッセージIDを抽出するawkスクリプトです。
awk '/client.host.name/ && !(/timeout/||/disconnect/) { sub(":","",$6);print $6}' maillog
これは、入力として標準のPostfixメールログを使用しています(サンプルデータについては、以下を参照してください)。私がやりたいと思うのは、最初の検索の結果を使用したファイルのマルチパス検索ですが、これが正しいアプローチであるかどうかはわかりません。似たようなもの:
awk '/client.host.name/ && !(/timeout/||/disconnect/) {sub(":","",$6);msgid=$6} $0 ~ msgid {print $0}' maillog
しかし、当然、これは期待どおりに機能しません。私は次のいずれかを行う必要があると想定しています。
- 最初のawkからの出力を2番目のawkまたはgrepにパイプします(パイプされた入力を正規表現として使用する方法がわかりません)。
- 最初の結果セットを配列に割り当て、その配列を検索セットとして使用します。次のようなもの
awk '/app02/ && !(/timeout/ || /connect/) { sub(":","",$6);msgid[$6]=$6; } END { for(x in msgid) { print x; } }' maillog
ですが、forループ内でどのように進めるかはわかりません。awkでファイルを「巻き戻し」てから、配列内の任意の要素に一致するすべての行を取得する方法はありますか? - 取引全体を破棄し、Perlを使用して試してください。
それで、awkの達人のために...私がawkを使って探していることを達成する方法はありますか?
サンプルデータ:
Jul 19 05:07:57 relay postfix/smtpd[5462]: C48F6CE83FA: client=client.dom.lcl[1.2.3.4]
Jul 19 05:07:57 relay postfix/cleanup[54]: C48F6CE83FA: message-id=<20100719100757.C48F6CE83FA@relay.dom.lcl>
Jul 19 05:07:57 relay postfix/qmgr[12345]: C48F6CE83FA: from=<root@dom.lcl>, size=69261, nrcpt=6 (queue active)
Jul 19 05:08:04 relay postfix/smtp[54205]: C48F6CE83FA: to=<recip1@example.org>, relay=in.example.org[12.23.34.5]:25, delay=0.7, delays=0.05/0/0.13/0.51, dsn=2.0.0, status=sent (250 ok: Message 200012345 accepted)
Jul 19 05:14:08 relay postfix/qmgr[12345]: C48F6CE83FA: removed`