2016-05-22 3 views
0

В настоящее время я пытаюсь записать tail журнал, но только показывая строки, содержащие несколько ключевых слов. В настоящее время я используюНесколько grep piping (include + exclude) приводит к тому, что ничего не отображается

tail -F file.log | grep -ie 'error\|fatal\|exception\|shutdown\|started' 

, и я получаю ожидаемые результаты: (например)

10:22 This is an error 
10:23 RuntimeException: uncaught problem 

Я также хочу, чтобы исключить строки, содержащие <DATATAG>, даже если ключевые слова проскользнули в него , потому что он содержит много двоичных данных, которые загромождают мой журнал. Я потом пытаюсь добавить к трубе другого Grep, исключающий тег:

tail -F file.log | grep -ie 'error\|fatal\|exception\|shutdown\|started' | grep -vF '<DATATAG>' 

Однако, на этот раз не появляются никаких линий, даже не предыдущие, что имеет «ошибку»/«исключение», но не <DATATAG>. Когда я попробовал исключить только grep:

tail -F file.log | grep -vF '<DATATAG>' 

все строки появляются, в том числе те, у которых есть «ошибка»/«исключение».

Я делаю что-то неправильно?

+0

Это буферизация, как @ jzer7 говорит, но вместо нескольких труб и отбирает, рассмотрим только один AWK: 'хвост -F file.log | awk '!//&& tolower ($ 0) ~/error | fatal | exception | shutdown | start /' '. –

ответ

1

Ваша проблема заключается в буферизации. grep - сложный инструмент, когда дело доходит до этого. От человека странице:

By default, output is line buffered when standard output is a terminal and block buffered otherwise. 

В вашем примере, первый grep буферизации на уровне блоков, так что не получится выход на 2-й grep на некоторое время. Решение состоит в том, чтобы использовать опцию --line-buffered выглядеть следующим образом:

tail -F file.log | grep --line-buffered -ie 'error\|fatal\|exception\|shutdown\|started' | grep -vF '<DATATAG>' 
Смежные вопросы