2017-02-10 4 views
3

(может быть, это «tcpflow» проблема)Grep с непрерывной трубой не работает

Я пишу сценарий для мониторинга HTTP-трафика, а также установить tcpflow, затем Grep

это работает (и вы должны сделать запрос HTTP, например curl www.163.com)

sudo tcpflow -p -c -i eth0 port 80 2>/dev/null | grep '^Host: ' 

он выводит, как это (непрерывно)

Host: config.getsync.com 
Host: i.stack.imgur.com 
Host: www.gravatar.com 
Host: www.gravatar.com 

, но я не могу продолжать использовать трубу

не работает (ничего выход)

sudo tcpflow -p -c -i eth0 port 80 2>/dev/null | grep '^Host: ' | cut -b 7- 

не работает (ничего выход)

sudo tcpflow -p -c -i eth0 port 80 2>/dev/null | grep '^Host: ' | grep H 

Когда Я заменяю sudo tcpflow на cat foo.txt, он работает:

cat foo.txt | grep '^Host: ' | grep H 

так что случилось с трубой или grep или tcpflow?


обновление:

Это мой последний сценарий: https://github.com/zhengkai/config/blob/master/script/monitor_outgoing_http.sh

+0

Что выход 'Sudo tcpflow -p -c -i eth0 порт 80 2>/dev/null | grep '^ Host:' '? – Inian

+0

@ В настоящее время я добавляю его в вопрос –

+0

Как это происходит? Нет выхода? –

ответ

4

Я думаю, что проблема из-за stdio buffering, вам нужно использовать GNU stdbuf перед вызовом grep,

sudo tcpflow -p -c -i eth0 port 80 2>/dev/null | stdbuf -o0 grep '^Host: ' 

С -o0, это в основном означает выход (stdout) поток от tcpflow будет небуферизован. Поведение по умолчанию будет автоматически буфера копирования данных в 4096 байт куски перед отправкой следующей команды в трубопроводе, что и переопределенная с помощью stdbuf


1. Обратитесь этот nice detail в тему.

+1

Буферная строка ('-oL') так же хороша в этом контексте (grep работает на целых строках в любом случае), и должна быть немного быстрее (не такая производительность действительно имеет значение в этом конкретном случае по всей вероятности). – Fred

6

В grep непрерывном потоке использовать --line-buffered вариант:

sudo tcpflow -p -c -i eth0 port 80 2> /dev/null | grep --line-buffered '^Host' 

--line-буферного

буферизацию использование линии на выходе. Это может привести к снижению производительности.


Некоторые размышления о забуференном вывода (stdbuf инструмент также упоминается):

Pipes, how do data flow in a pipeline?

+1

Хорошее предложение. Возможно, было бы полезно объяснить, что это делает, и почему это имеет значение в этом контексте. – Fred

Смежные вопросы