简化 `tcpdump` 输出
Simplify `tcpdump` output
我想转换这个 tcpdump
输出:
IP 10.10.10.1 > 20.20.20.1: ICMP echo request, id 8312, seq 0, length 64
IP 10.10.10.1.17441 > 20.20.20.1.22: Flags [S], seq 3936449810, win 65535, options [mss 1460,nop,wscale 6,sackOK,TS[|tcp]>
至:
IP 10.10.10.1 > 20.20.20.1: ICMP
IP 10.10.10.1.17441 > 20.20.20.1.22: tcp
我尝试了很多方法来使用 shell 脚本通过 cut
命令来隐藏它们,但我做不到。
感谢大家的帮助。
这完全是一种 cut
方法。假设您的输出将始终采用这种格式。如前所述,sed
(或awk
)版本可能会更动态。
其中的主要部分是 -d
(定界符)参数和 -f
(字段)参数。 -f
可以指定由指定分隔符分隔的单个字段或字段范围(我相信制表符是默认设置)。
如果您的输出在名为 output.txt 的文件中,您可以使用这个小脚本。
line1="$(head -1 output.txt | cut -d ' ' -f1-5)"
line2="$(tail -1 output.txt | cut -d ' ' -f1-4) $(tail -1 output.txt | cut -d '|' -f2 | cut -d "]" -f1)"
echo "$line1"
echo "$line2"
如果您的输出存储在一个名为 output 的变量中,您可以将此脚本与您的
作为参数发送的变量,如 ./script.sh "$output"
arg=""
line1="$(echo "$arg" | head -1 | cut -d ' ' -f1-5)"
line2="$(echo "$arg" | tail -1 | cut -d ' ' -f1-4) $(echo "$arg" | tail -1 | cut -d '|' -f2 | cut -d "]" -f1)"
echo "$line1"
echo "$line2"
输出:
IP 10.10.10.1 > 20.20.20.1: ICMP
IP 10.10.10.1.17441 > 20.20.20.1.22: tcp
使用 awk
(或 GNU gawk
),将字段分隔符 FS
设置为“:”并假设转储在 test.txt:
中
gawk 'BEGIN{ FS=":" } { if([=10=] ~ / ICMP /){ print ": ICMP" }else if([=10=] ~ /tcp[]]>/){ print ": tcp" } }' test.txt
预期结果:
IP 10.10.10.1 > 20.20.20.1: ICMP
IP 10.10.10.1.17441 > 20.20.20.1.22: tcp
tcpdump
输出可以通过管道传输到 gawk
作为
tcpdump <options> | gawk ' ... '
我想转换这个 tcpdump
输出:
IP 10.10.10.1 > 20.20.20.1: ICMP echo request, id 8312, seq 0, length 64
IP 10.10.10.1.17441 > 20.20.20.1.22: Flags [S], seq 3936449810, win 65535, options [mss 1460,nop,wscale 6,sackOK,TS[|tcp]>
至:
IP 10.10.10.1 > 20.20.20.1: ICMP
IP 10.10.10.1.17441 > 20.20.20.1.22: tcp
我尝试了很多方法来使用 shell 脚本通过 cut
命令来隐藏它们,但我做不到。
感谢大家的帮助。
这完全是一种 cut
方法。假设您的输出将始终采用这种格式。如前所述,sed
(或awk
)版本可能会更动态。
其中的主要部分是 -d
(定界符)参数和 -f
(字段)参数。 -f
可以指定由指定分隔符分隔的单个字段或字段范围(我相信制表符是默认设置)。
如果您的输出在名为 output.txt 的文件中,您可以使用这个小脚本。
line1="$(head -1 output.txt | cut -d ' ' -f1-5)"
line2="$(tail -1 output.txt | cut -d ' ' -f1-4) $(tail -1 output.txt | cut -d '|' -f2 | cut -d "]" -f1)"
echo "$line1"
echo "$line2"
如果您的输出存储在一个名为 output 的变量中,您可以将此脚本与您的
作为参数发送的变量,如 ./script.sh "$output"
arg=""
line1="$(echo "$arg" | head -1 | cut -d ' ' -f1-5)"
line2="$(echo "$arg" | tail -1 | cut -d ' ' -f1-4) $(echo "$arg" | tail -1 | cut -d '|' -f2 | cut -d "]" -f1)"
echo "$line1"
echo "$line2"
输出:
IP 10.10.10.1 > 20.20.20.1: ICMP
IP 10.10.10.1.17441 > 20.20.20.1.22: tcp
使用 awk
(或 GNU gawk
),将字段分隔符 FS
设置为“:”并假设转储在 test.txt:
gawk 'BEGIN{ FS=":" } { if([=10=] ~ / ICMP /){ print ": ICMP" }else if([=10=] ~ /tcp[]]>/){ print ": tcp" } }' test.txt
预期结果:
IP 10.10.10.1 > 20.20.20.1: ICMP
IP 10.10.10.1.17441 > 20.20.20.1.22: tcp
tcpdump
输出可以通过管道传输到 gawk
作为
tcpdump <options> | gawk ' ... '