awkを使用して部分文字列インデックスでORを使用する方法

awkを使用して部分文字列インデックスでORを使用する方法

文字列の単語をフィルタリングしたい。以下のコマンドで「TCP」フィルタの単語を出力できます。

awk '{print substr($0, index($0, "{TCP}"))}'

これは私のサンプル入力です。

01/08-21:03:05.312358 [] [1:5000001:1] Attack Detected [] [Priority: 0] {TCP} 139.150.160.188:40001 -> 192.168.2.1:80` 

だから後でIPを抽出したいと思います{TCP}。私はエキスを使用しましたsed。ログファイルに{ICMP}ANDプロトコルがあるかどうかを知りたいです。 OR操作のようにBetween文字列を{UDP}使用してフィルタリングできますか?||

フィルタに「OR」を使用してUDPとICMPをフィルタリングできますか?これが可能か…?

 awk '{print substr($0, index($0, "{TCP}" || "{UDP}" ||"{ICMP}"))}'

ありがとうございます。

答え1

使用できますが、awkREGEXP構文はC-styleブール演算子とは少し異なる動作をします。上記のすべてのケースでIPアドレスを抽出すると仮定すると、次のことが機能します。

awk '{if (match($0,/{(TCP|UDP|ICMP)} ([[:digit:]:.]{15})/,v)) print(v[2])}' logfile.txt

ここで使用されているmatch関数は、文字列または後にスペースとIPv4(数字やピリオドで構成される15文字)awkを検索し、正規表現の後半(たとえば括弧で囲まれたサブグループ)の実際の値を抽出します。内部配列はvaruableに保存します。TCPUDPICMP0-9.awkv

一致するものが見つかった場合は、2番目のグループ化されたサブ式の実際の値を印刷しますv[2](最初のものはプロトコルのORグループです)。(...)この機能を使用するにはmatch()GNU Awkが必要です。

これは、条件が満たされた場合(呼び出しがゼロ以外の値を返す)、1つの操作のみが実行される単純な作業ステートメントであるため、match()一般的な<condition> { <actions> }構文で書くこともできますawk

awk 'match($0,/{(TCP|UDP|ICMP)} ([[:digit:]:.]{15})/,v)) {print v[2]}' logfile.txt

関連情報