特定のポートと特定のパケットにアクセスする行に一致する正規表現

特定のポートと特定のパケットにアクセスする行に一致する正規表現

Linux は初めてで、これを動作させる唯一の方法は awk コマンドを使用することですが、残念ながらメインの指示では awk を使用しないように指定されています。

これが私が手に入れたものだ

#!/bin/sh
#comment Write a single RegEx to match the lines that access port 22 and only those packets
grep '\s22\s' hw0206.txt | awk {'print $4'}
#comment grep returns the whole line with matched string
#comment \s22\s regular expression to match any string containing 22 preceded or succeeded by white space

説明書

ポート22にアクセスする行とそれらのパケットのみに一致する単一の正規表現を記述し、IPアドレスを返します。

Input file (hw0206.txt) Expected output of script
date time protocol ip-address port packet-size
2022-02-21 19:22:19 TCP 22.101.2.24 22 24
2018-22-22 02:25:12 UDP 10.221.7.22 2135 222
2200-05-22 22:26:22 UDP 22.122.6.62 2160 22
2012-22-20 15:43:22 TCP 10.121.7.222 22 122
1228-02-10 02:22:02 UDP 22.102.2.62 2089 22 
date time protocol ip-address port packet-size
2022-02-21 19:22:19 TCP 22.101.2.24 22 24
2018-22-22 02:25:12 UDP 10.221.7.22 2135 222
2200-05-22 22:26:22 UDP 22.122.6.62 2160 22
2012-22-20 15:43:22 TCP 10.121.7.222 23 122
1228-02-10 02:22:02 TCP 22.102.2.62 22 22
2100-05-25 21:26:22 UDP 22.112.63.62 2122 22

答え1

肯定的な先のことを考える結果の一部ではないものを一致させることができます。

grep -Po '(\d+\.){3}\d+(?=\s22\s)' hw0206.txt

この場合、awkより読みやすいソリューションを提供する次のものを好みます。

awk '$5 == 22 {print $4}' hw0206.txt

関連情報