Awk

sed/awk:在最後一次出現 ‘.’ 後替換一行中的數字

  • February 3, 2020

我有以下 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

埠號是十進制的。如何將其通過管道傳輸到 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

如果我有埠號,我會使用它來將其轉換為十六進制:

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

我一直在嘗試解決這個問題,但沒有運氣。如何'.'在流的第三和第五列中最後一次出現後替換埠號,然後動態將其更改為十六進制?

perl

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

它查找由一個空格 ( \s) 後跟一個或多個( +)非空格( \S) 的序列、一個點和一個或多個數字 ( \d+) 的序列組成的單詞,並替換結束部分(其開頭標有\K)用十進制$&格式的相同 ( ) xg局部,替換被e評估為 perl 程式碼)。

在每個 UNIX 機器上的任何 shell 中使用任何 awk:

$ cat tst.awk
function mkPortHex(fldNr,       port, sfx) {
   port = sfx = $fldNr
   sub(/.*\./,"",port)
   sub(/.*[0-9]/,"",sfx)
   sub(/[^.]+$/,sprintf("%x%s",port,sfx),$fldNr)
}
{
   mkPortHex(3)
   mkPortHex(5)
   print
}

$ awk -f tst.awk file
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

使用 GNU awk 將第三個參數匹配():

$ cat tst.awk
function mkPortHex(fldNr) {
   match($fldNr,/(.*\.)([0-9]+)(:?)/,a)
   $fldNr = a[1] sprintf("%x",a[2]) a[3]
}
{
   mkPortHex(3)
   mkPortHex(5)
   print
}

$ awk -f tst.awk file
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

引用自:https://unix.stackexchange.com/questions/565235