しばらくこの問題を解決しようとしてきました。このウェブサイトを発見し、狂ったようにグーグルをしました。誰でも助けていただければ幸いです。
ヘッダーと列のないいくつかのログファイルがあちこちにあります。これは、src = 4.2.2.2などのエントリがファイルのどこにでも存在できることを意味します。ファイル内のすべてのオブジェクトはSomething = xxx形式を持ちます。
ログの例:
src=1.1.1.1 sport=12312 dport=80 メッセージ=ハッキング
dport=443 src=2.2.2.2 メッセージ=null スポーツ=32432
メッセージ=クリーンdport=21移動=43434 src=3.3.3.3
match()関数を使用しましたが、複数のフィールドを抽出しようとしています。
gawk 'match($0, "src=([^ ]+)") { print substr($0, RSTART, RLENGTH) } ' ファイル
私に以下を提供します:
ソース=1.1.1.1
ソース=2.2.2.2
ソース=3.3.3.3
出力が次のようにソートされるように、src、dport、messageなどのいくつかのフィールドが必要です。
src=1.1.1.1 dport=80 message=ハッカー攻撃
src=2.2.2.2 dport=443 メッセージ=null
src=3.3.3.3 dport=21 メッセージ=クリーン
gawkなどを使ってこれを行うことはできますか?
ありがとうございます!
答え1
GNU awkを使用する(注:「キー」文字列の語彙ソート順によって異なります):
gawk '{split($0,a); asort(a); printf("%s\t%s\t%s\n", a[4], a[1], a[2])}' file
src=1.1.1.1 dport=80 message=hacked
src=2.2.2.2 dport=443 message=null
src=3.3.3.3 dport=21 message=clean
答え2
Awk
ソリューション(プロジェクトの場所に関係ありません):
awk 'function get_item(name){
match($0, name"=[^[:space:]]+");
return substr($0, RSTART, RLENGTH)
}
{ print get_item("src"), get_item("dport"), get_item("message") }' file
上記の方法を使用すると、主要な必須項目を順序に関係なく出力できます。
出力:
src=1.1.1.1 dport=80 message=hacked
src=2.2.2.2 dport=443 message=null
src=3.3.3.3 dport=21 message=clean