Чому grep не працює з перенаправленням?


15

Використання topкоманди з перенаправленням прекрасно працює:

top > top.log

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

top | grep "my_program" > top.log

Але файл журналу залишиться порожнім. Але grep забезпечує вихід при використанні

top | grep "my_program"

Де my_programпотрібно замінити запущену програму, щоб побачити деякий вихід.

Чому мій підхід не працює? І як я можу це виправити?

bash  grep 

2
Я просто спробував це, і це працює на мене. Однак вам, мабуть, слід поглянути на -bваріант для topвикористання або psзамість цього.
Лев Левицький

-bне вирішив мою проблему, але вирішив деякі проблеми кодування. Дякую.

Відповіді:


22

Я отримую таку ж поведінку, яку ви описуєте. У Ubuntu 11.10

top | grep "my_program" > top.log

не дає жодного результату.

Я вважаю, що причина цього в тому, що греп буферизує свій вихід. Щоб сказати GNU grep виплюнути вихідний рядок, використовуйте --line-bufferedпараметр:

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

Дивіться також це питання ТА щодо інших потенційних рішень.


3
+1 --line-bufferedвирішує проблему.

Дякую, це вирішує проблему і для мене. Цей -bваріант все ще є гарною порадою від Льва Левицького. Це вирішило деякі проблеми кодування з файлом журналу.

2

ви повинні використовувати:

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

"-n 1" працює зверху на одну ітерацію, а потім виходить, а не постійно оновлювати кожні кілька секунд

так як ви просто шукаєте один рядок, хоча PS був би кращим інструментом для використання.


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заповнення може зайняти деякий час .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.