- PR -

正規表現について教えてください。

1
投稿者投稿内容
ひさ♪
常連さん
会議室デビュー日: 2002/09/20
投稿数: 23
投稿日時: 2007-06-12 14:20
テキスト形式で保存しているあるログファイルの内容を
データベースに保存したくて、必要なログの項目を洗い出す作業をしております。

以下のようなログで、各項目は出現する順番が異なります。
id=firewall time="2007-04-01 00:00:02" msg="Close outbound" type=ok proto=tcp src=172.17.1.1 srcport=1222 dst=192.168.2.5 dstport=139 rule=15

id=firewall time="2007-04-01 00:00:03" flt_action=Block msg="Close outbound" type=ng proto=tcp src=172.17.1.2 srcport=1222 dst=192.168.3.1 dstport=80 rule=15

このようなログから、
time,src,srcport,dst,dstport
の形式に直したいと考えています。

お知恵をお貸しください。
kata
ベテラン
会議室デビュー日: 2006/10/04
投稿数: 69
投稿日時: 2007-06-12 16:05
kataと申します。

引用:

このようなログから、
time,src,srcport,dst,dstport
の形式に直したいと考えています。



シェルスクリプトなどで行うのであれば、
awk、grep、cutなどのコマンドの組み合わせでできませんか?

Firewallのログ採取のようですが、
Firewallの機種によっては、設定で出力されるログの順番や形式を変更することができるものもあります。
どのような形で取り込みたいのかにもよると思います。
私の場合は、
@syslogサーバでFirewallのログを収集
ADB(Postgres)サーバにINSERT
BApache+PHPでブラウザ表示
というシステムを構築したことがあります。

以上、ご参考までに。



[ メッセージ編集済み 編集者: kata 編集日時 2007-06-12 16:07 ]
F/A
ぬし
会議室デビュー日: 2006/03/18
投稿数: 312
お住まい・勤務地: Tokyo
投稿日時: 2007-06-12 22:28
出現する順番が変化するログですか。
まずその妙な仕様をどうかするべきだと思いますが…

力技ならこんな感じですかねぇ…

while read i
do
echo -n $i | sed 's/.*time="\([0-9 :-]*\).*".*/\1/'
echo -n ,
(省略)
done
Ay
常連さん
会議室デビュー日: 2006/10/29
投稿数: 45
投稿日時: 2007-06-13 13:17
こんにちは。

こんなのでどうでしょうか(perl)
コード:
#!/usr/bin/perl

while (<>) {
  %item = map { split /=/ } split /\s(?=\w+=)/;
  print "$item{time},$item{src},$item{srcport},$item{dst},$item{dstport}\n";
}


(※ 逆スラッシュは全角になってます…)
ひさ♪
常連さん
会議室デビュー日: 2002/09/20
投稿数: 23
投稿日時: 2007-06-13 15:46
皆さんありがとうございます。

Ayさんのperlスクリプトの例には、感激しました。処理が早い!
150万行の解析を2分少々で完了しました。

ちょこっと修正して利用させていただきます。
1

スキルアップ/キャリアアップ(JOB@IT)