Sh 简化“tcpdump”输出

Sh 简化“tcpdump”输出,sh,freebsd,tcpdump,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]> 致: 我尝试了很多通过使用cut命令用shell脚本来隐

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

我尝试了很多通过使用
cut
命令用shell脚本来隐藏它们,但是我做不到


谢谢大家的帮助。

这是一种严格意义上的
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”

输出:

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
设置为“:”,并假设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
as

tcpdump <options> | gawk ' ... '
tcpdump | gawk'…'

请包含生成给定输出的确切的
tcpdump
命令。您可能需要查看。
IP 10.10.10.1 > 20.20.20.1: ICMP
IP 10.10.10.1.17441 > 20.20.20.1.22: tcp
tcpdump <options> | gawk ' ... '