sed/awk: "." が最後に表示された次の行の数字を置き換えます。

sed/awk:

次のtcpdumpストリームがあります。

Current:
07:36:03.848461 IP 172.17.3.41.33101 > 172.17.3.43.17408: UDP, length 44
07:36:03.848463 IP 172.17.3.42.33101 > 172.17.3.43.17409: UDP, length 44
07:36:03.848467 IP SYSTEM-A.33101 > 172.17.3.43.17418: UDP, length 45
07:36:03.848467 IP SYSTEM-B.33101 > 172.17.3.43.17419: UDP, length 45

ポート番号は10進表記で表されます。ポート番号を16進数に変更した同じストリームにするには、ストリームをsedまたはawkにパイプして変更するにはどうすればよいですか?

Expected:
07:36:03.848461 IP 172.17.3.41.814d > 172.17.3.43.4400: UDP, length 44
07:36:03.848463 IP 172.17.3.42.814d > 172.17.3.43.4401: UDP, length 44
07:36:03.848467 IP SYSTEM-A.814d > 172.17.3.43.440a: UDP, length 45
07:36:03.848467 IP SYSTEM-B.814d > 172.17.3.43.440b: UDP, length 45

ポート番号がある場合は、それを使用して16進数に変換します。

echo 33101 | sed  -e 's/.*://' | xargs printf "%x\n"
814d

私はこの問題を解決しようとしましたが、運がありませんでした。'.'ストリームの3番目と5番目の列で最後に発生したポート番号を変更してからすぐに16進数に変更するにはどうすればよいですか?

ベストアンサー1

そしてperl

perl -pe 's/\s\S+\.\K\d+/sprintf "%x", $&/ge' < your-file

\sスペース()の後に続く単語で構成される単語を見つけます。1つ以上の順序( +)空白ではない\S)、ドット、および1つ以上の数値シーケンス()を使用し、最後の部分(開始部分がと表示されます)を10進形式の同じ()に置き換えます\d+(通常、置換はPerlコードで評価されます)。\K$&xge

おすすめ記事