在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,导出到另一个文件,但这使得无法实时读取编辑的文件。关于为什么会发生这种情况的任何想法?
答案 0 :(得分:4)
awk
有一个fflush
函数,用于发送输出缓冲区:
sudo tcpdump -i eth0 -q -l | awk '{print $3; fflush}' | tee -a file.txt