нужна помощь с grep при выводе другой команды grep - PullRequest
2 голосов
/ 03 февраля 2011

У меня есть файл test.log. Очень большой файл журнала. У этого есть различные уровни регистрации. Например, trace, debug, info, warning и error.

Очевидно, что сообщения уровня trace просто спамятся на высоких скоростях. Я хотел видеть все сообщения без журналов trace level.

Итак, я сделал это:

cat test.log | grep -v "trace"

Хорошо работает.

Теперь я хочу отфильтровать оставшиеся сообщения по определенному ключевому слову keyword1.

Итак, я сделал это:

cat test.log | grep -v "trace" | grep "keyword1"

Хорошо работает.

Теперь я хочу получать один и тот же вывод постоянно, я думал заменить cat на tail -f.

tail -f test.log | grep -v "trace" | grep "keyword1"

Но это не работает. Я вообще ничего не получаю.

Что я делаю не так? И как я могу получить желаемый отфильтрованный вывод «tail & follow».

Спасибо за помощь.

(кстати, я использую Cygwin ... если это имеет какое-либо значение)

Ответы [ 3 ]

3 голосов
/ 03 февраля 2011

Вы столкнулись с проблемами буферизации: по соображениям производительности grep сохранит довольно много информации в своем буфере и выведет весь кусок за один раз.Это означает, что когда строка читается из входных данных, grep отправит ее на стандартный вывод, как только она прочитает (и пропустит) еще больше строк - что может быть довольно поздно, когда имеешь дело с читаемым файлом журнала.-в использовании tail -f.

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

Просто добавьте эту опцию (или подходящую для вашей версии grep) на все ваши вызовы grep, и вы увидите некоторые результаты, как только в файл журнала будет добавлено совпадение.

0 голосов
/ 03 февраля 2011

tail -f следует за "новыми входящими строками" файла. Периодический вывод никогда не достигнет переданных команд grep (по крайней мере, до тех пор, пока tail не будет завершен).

Чтобы периодически «следить» за изменениями в этих файлах журнала, вы можете использовать watch вместо:

watch -n 1 -- 'tail -n 20 test.log | grep -v trace | grep keyword1'

Это будет обновлять каждую секунду (-n 1) последние 20 строк файла журнала.

0 голосов
/ 03 февраля 2011

Ваш код работает нормально, вы просто столкнулись с задержками буферизации. Таким образом, вы увидите длинный промежуток времени, сопровождаемый коротким всплеском текста, а затем еще одно ожидание. Прочитайте http://perl.plover.com/FAQs/Buffering.html для объяснения того, что происходит.

...