0

在 bash 中,通常您不能将 tcpdump 的输出发送到 awk 表达式,如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,导出到另一个文件,但这使得无法实时读取已编辑的文件。关于为什么会发生这种情况的任何想法?

4

1 回答 1

4

awk有一个fflush发送输出缓冲区的函数:

sudo tcpdump -i eth0 -q -l | awk '{print $3; fflush}' | tee -a file.txt
于 2013-06-30T08:56:29.567 回答