文字列の単語をフィルタリングしたい。以下のコマンドで「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
使用できますが、awk
REGEXP構文はC
-styleブール演算子とは少し異なる動作をします。上記のすべてのケースでIPアドレスを抽出すると仮定すると、次のことが機能します。
awk '{if (match($0,/{(TCP|UDP|ICMP)} ([[:digit:]:.]{15})/,v)) print(v[2])}' logfile.txt
ここで使用されているmatch
関数は、文字列または後にスペースとIPv4(数字やピリオドで構成される15文字)awk
を検索し、正規表現の後半(たとえば括弧で囲まれたサブグループ)の実際の値を抽出します。内部配列はvaruableに保存します。TCP
UDP
ICMP
0-9
.
awk
v
一致するものが見つかった場合は、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