2016-04-24 7 views
0

Неожиданно оказалось, это не удается (не выход; судимые ш, ЗШ, Баш):Почему я не могу фильтровать вывод хвоста несколько раз через трубы?

echo "foo\nplayed\nbar" > /tmp/t && tail -f /tmp/t | grep played | sed 's#pl#st#g'

Обратите внимание, что в два раза Grep также терпит неудачу, что свидетельствует о том, что это довольно несущественные, какие команды используются:

# echo -e "foo\nplayed\nbar" > /tmp/t && tail -f /tmp/t | grep played | grep played 

GREP одни работы:

# echo -e "foo\nplayed\nbar" > /tmp/t && tail -f /tmp/t | grep played 
played 

СЭД покое работы:

# echo -e "foo\nplayed\nbar" > /tmp/t && tail -f /tmp/t | sed 's#pl#st#g'` 
foo 
stayed 
bar 

С кошки вместо хвост, он работает:

# echo -e "foo\nplayed\nbar" > /tmp/t && cat /tmp/t | grep played | sed 's#pl#st#g' 
stayed 

С journalctl --follow, Это неудачно, как с tail.

В чем причина неспособности трубы дважды?

ответ

1

Это проблема с буферизацией - первые буферы grep, которые выводятся, когда они соединяются с другой командой, но нет, если она печатается в стандартном режиме. См. http://mywiki.wooledge.org/BashFAQ/009 для получения дополнительной информации.

+0

Спасибо, ред. В статье предлагается сначала проверить, нет ли лишних команд, которые могут быть устранены. В моем конкретном случае я смог сделать это, добавив '--silent' и явно напечатав замещенные строки (' p'). Например, 'sed --silent '# pl # st # p''. (В противном случае упомянутые варианты * небуферизованные * были бы в пути.) – user569825

+0

Я никогда не слышал о '--silent', похоже, что он делает то же самое, что и более обычный' -n'. Это будет печатать строки, содержащие 'pl' в контексте, отличном от' play'. Вы можете делать такие вещи, как '/ play/{s/pl/st/gp}' с sed, проверяя синтаксис. В awk это будет 'awk '/ play/{gsub (/ pl /," st "); print}''. –

+0

К счастью, мой прецедент более сложный, чем пример, который я дал. Таким образом, каждая строка, которая получает подстановки, действительно желательна в выводе. Тем не менее, для будущих случаев мне будет интересно узнать правильный синтаксис для sed. (Btw '--silent' * is *' -n'. Я просто предпочитаю использовать сложные варианты переключателей при написании сценариев и документировании.) – user569825