AWKコンテストは定期的に開催されます。列がソートされていません。

AWKコンテストは定期的に開催されます。列がソートされていません。

しばらくこの問題を解決しようとしてきました。このウェブサイトを発見し、狂ったようにグーグルをしました。誰でも助けていただければ幸いです。

ヘッダーと列のないいくつかのログファイルがあちこちにあります。これは、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

関連情報