Почему grep не работает с перенаправлением?

15

Использование topкоманды с перенаправлением работает нормально:

top > top.log

Теперь я хочу использовать grep для фильтрации определенной строки:

top | grep "my_program" > top.log

Но файл журнала останется пустым. Но grep выдает вывод при использовании

top | grep "my_program"

Где my_programдолжен быть заменен работающей программой, чтобы увидеть некоторые результаты.

Почему мой подход не работает? И как я могу это исправить?


источник
2
Я только что попробовал, и это работает для меня. Тем не менее, вы, вероятно, должны рассмотреть -bвариант topили использовать psвместо этого.
Лев Левицкий
-bне решил мою проблему, но решил некоторые проблемы с кодировкой. Спасибо.

Ответы:

22

Я получаю то же поведение, которое вы описываете. На Ubuntu 11.10

top | grep "my_program" > top.log

не производит никакого вывода.

Я считаю, что причина этого в том, что grep буферизирует свой вывод. Чтобы GNU grep выводил вывод за строкой, используйте --line-bufferedпараметр:

top | grep --line-buffered "my_program" > top.log

Смотрите также этот вопрос для других потенциальных решений.

unutbu
источник
3
+1 --line-bufferedрешает проблему.
Спасибо, это тоже решает проблему для меня. -bВариант еще хороший совет от Льва Левицкого, тоже. Это решило некоторые проблемы кодирования с файлом журнала.
2

Вы должны использовать:

top -n 1 | grep "blah" > top.log

«-n 1» запускается на вершине в течение одной итерации, а затем выходит вместо постоянного обновления каждые несколько секунд

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

h3rrmiller
источник
1

Мой обходной путь для этой проблемы был:

while :;do top -b -n 1 | grep "my_program" >> top.log;done &

Таким образом, у меня может быть запущенный монитор в фоновом режиме для my_program и все результаты сохранены в файле top.log.

Алекс Сед
источник
0

Хотя оба работают на меня, я думаю, что совет Льва Левицкого правильный. Используйте -bаргумент.

Есть большая вероятность, что проблема заключается в перенаправлении вывода, и вы ничего не получаете через stdout, поэтому попробуйте это:

top -b 2>&1 | grep "my_program" > top.log

Обратите внимание, что у вас могут возникнуть проблемы с буферизацией вывода. Ваша оболочка не будет постоянно записывать в файл, поэтому top.logзаполнение может занять некоторое время .

Wolph
источник