在 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,导出到另一个文件,但这使得无法实时读取已编辑的文件。关于为什么会发生这种情况的任何想法?