多次管道tcpdump的输出

时间:2013-06-30 08:48:50

标签: bash unix awk pipe tcpdump

在bash中,通常你不能将tcpdump的输出发送到awk表达式,如this Stack Exchange question中所述。 这没有任何打印:

sudo tcpdump -i en1 -n -q 'tcp[13]=18 and src port 80' | awk '{$0=$3; sub(".80$",""); print $0}'

解决方案是使用-l标志来缓冲输出,就像这样,它按预期工作:

sudo tcpdump -i en1 -n -q -l 'tcp[13]=18 and src port 80' | awk '{$0=$3; sub(".80$",""); print $0}'

但是,当我尝试将awk的输出传递给文件或其他任何地方时,即使tcpdump说它收到了数据包,也会创建该文件但保持为空。

sudo tcpdump -i en1 -n -q -l 'tcp[13]=18 and src port 80' | awk '{$0=$3; sub(".80$",""); print $0}' | tee -a file.txt

sudo tcpdump -i en1 -n -q -l 'tcp[13]=18 and src port 80' | awk '{$0=$3; sub(".80$",""); print $0}' | awk '{print $3}' >> file.txt

我的解决方法是输出到文件,然后在文件上运行awk,导出到另一个文件,但这使得无法实时读取编辑的文件。关于为什么会发生这种情况的任何想法?

1 个答案:

答案 0 :(得分:4)

awk有一个fflush函数,用于发送输出缓冲区:

sudo tcpdump -i eth0 -q -l | awk '{print $3; fflush}' | tee -a file.txt