В bash обычно вы не можете отправить вывод tcpdump в выражение awk, как описано в this Stack Exchange question. Это ничего не печатает:Проводка вывода tcpdump несколько раз
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 на файл позже, экспорт в другой файл, но это делает его невозможно прочитать отредактированный файл в настоящее время. Любые идеи о том, почему это происходит?
'awk' также буферизует свой вывод (большинство программ вывода буфера, когда они пишут в файл или трубу, потому что это поведение по умолчанию стандартного вывода). К сожалению, у него нет такой опции, как 'tcpdump -l', чтобы он не буферизировал. – Barmar
Я упростил фрагменты кода, чтобы упростить их чтение, и теперь первый работает, но мой оригинал все еще не работает. Изменение фрагментов кода сейчас. – shardbearer
Фрагменты кода не имеют большого значения, решение одинаково независимо от того, что вы делаете. Вам просто нужно очистить после печати. – Barmar