简化`tcpdump`输出

时间:2018-06-13 12:09:55

标签: sh freebsd tcpdump

我想转换此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

我尝试使用cut命令用shell脚本转换它们但我不能。

感谢大家的帮助。

2 个答案:

答案 0 :(得分:1)

使用awk(或GNU gawk),将字段分隔符FS设置为":"并假设dump在test.txt中:

gawk 'BEGIN{ FS=":" } { if($0 ~ / ICMP /){ print $1 ": ICMP" }else if($0 ~ /tcp[]]>/){ print $1 ": 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 ' ... '

答案 1 :(得分:0)

这是一种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="$1"
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