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
埠號是十進制的。如何將其通過管道傳輸到 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
)用十進制$&
格式的相同 ( )x
(g
局部,替換被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