трубопровод к awk висит - PullRequest
       37

трубопровод к awk висит

1 голос
/ 06 августа 2011

Я пытаюсь передать tshark вывод на awk. Команда tshark сама по себе работает нормально, а при передаче по каналу в другие программы, такие как cat, работает нормально (вывод в реальном времени). Однако при передаче по awk он зависает и ничего не происходит.

sudo tshark -i eth0 -l -f "tcp" -R 'http.request.method=="GET"' -T fields -e ip.src -e ip.dst -e 
tcp.srcport -e tcp.dstport -e tcp.seq -e tcp.ack | awk '{printf("mz -A %s -B %s -tcp \"s=%s sp=%s 
dp=%s\"\n", $2, $1, $5, $4, $3)}'

Вот более простая версия:

sudo tshark -i eth0 -f "tcp" -R 'http.request.method=="GET"' | awk '{print $0}'

И для сравнения, следующее прекрасно работает (хотя и не очень полезно):

sudo tshark -i eth0 -f "tcp" -R 'http.request.method=="GET"' | cat

Заранее спасибо.

Ответы [ 2 ]

4 голосов
/ 22 марта 2013

У меня была такая же проблема.

Я нашел некоторые частичные «решения», которые не являются полностью переносимыми. Некоторые из них указывают на использование функций fklush () или flush () awk или -W интерактивной опции

http://mywiki.wooledge.org/BashFAQ/009

Я пробовал оба, и ни один не работает. Так что awk совсем не подходящая команда.

Некоторые из них предлагают использовать gawk, но мне это тоже не подходит.

команда cut имеет ту же проблему.

Мое решение: в моем случае мне просто нужно было поставить --line-buffered в GREP и не трогать команду awk, но в вашем случае я бы попробовал:

sed -u 

с правильным регулярным выражением. Например:

sed -u 's_\(.*\)     \(.*\)  \(.*\) DIFF: \(.*\)_\3 \4_'

Это выражение дает вам 3-й и 4-й столбцы, разделенные TAB (записанные с помощью комбинации Ctrl + V и TAB). С опцией -u вы получите небуферизованный вывод, а также у вас есть опция -l, которая выдаст вам буферизованный вывод.

Надеюсь, вы найдете этот ответ полезным, хотя уже поздно

2 голосов
/ 08 августа 2011

Согласно нашим предыдущим сообщениям в комментариях, возможно, это сработает, чтобы принудительно закрыть ввод и выдать перевод строки.

sudo tshark -i eth0 -f "tcp" -R 'http.request.method=="GET"' ...... \
| {
    awk '{print $0}'
    printf "\n"
  }

Обратите внимание, что между awk и printf нет канала.

Надеюсь, это поможет.

...