tcpdump:仅输出源和目标地址

Eig*_*gir 7 bash awk sed tcpdump

问题描述:

我想只打印来自tcpdump [1]的源和目标地址.

有一个有效的解决方案,但相信它可以得到很大改善.一个捕获5个数据包的示例,就像我正在寻找的一个例子:

tcpdump -i eth1 -n -c 5 ip | \
cut -d" " -f3,5 | \
sed -e 's/^\([0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\)\..* \([0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\).*$/\1 > \2/'
Run Code Online (Sandbox Code Playgroud)

题:

这可以用任何更简单的方式完成吗?性能也是一个问题.

[1]测试的一部分,如果正确定义了snort home_net,或者我们是否看到home_net中未定义的流量.


解:

好的,感谢所有回复此问题的人.有两个与答案有关的问题,一个是不同linux版本之间的兼容性,第二个是速度.

这是我做的速度测试的结果.首先是grep版本:

time tcpdump -l -r test.dmp -n ip 2>/dev/null | grep -P -o '([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+).*? > ([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)' | grep -P -o '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+' | xargs -n 2 echo >/dev/null

real    0m5.625s
user    0m0.513s
sys     0m4.305s
Run Code Online (Sandbox Code Playgroud)

那么sed版本:

time tcpdump -n -r test.dmp ip | sed -une 's/^.* \(\([0-9]\{1,3\}\.\?\)\{4\}\)\..* \(\([0-9]\{1,3\}\.\?\)\{4\}\)\..*$/\1 > \3/p' >/dev/null
reading from file test.dmp, link-type EN10MB (Ethernet)

real    0m0.491s
user    0m0.496s
sys     0m0.020s
Run Code Online (Sandbox Code Playgroud)

最快的一个,awk版本:

time tcpdump -l -r test.dmp -n ip | awk '{ print gensub(/(.*)\..*/,"\\1","g",$3), $4, gensub(/(.*)\..*/,"\\1","g",$5) }' >/dev/null
reading from file test.dmp, link-type EN10MB (Ethernet)

real    0m0.093s
user    0m0.111s
sys     0m0.013s
Run Code Online (Sandbox Code Playgroud)

不幸的是我无法测试它们的兼容性,但由于gensub功能,awk需要gnu awk才能工作.无论如何,这三个解决方案都适用于我测试过的两个平台.:)

Ste*_*eve 8

这是使用的一种方式GNU awk:

tcpdump -i eth1 -n -c 5 ip | awk '{ print gensub(/(.*)\..*/,"\\1","g",$3), $4, gensub(/(.*)\..*/,"\\1","g",$5) }'
Run Code Online (Sandbox Code Playgroud)