Объединить хвост -f с grep?

26

Привет, я хочу смотреть на файл журнала, но я также не хочу видеть ненужные вещи, меня интересует только что-нибудь с "foobar".

Так что, если бы я следил за файлом, я бы сделал

 tail file | grep "foobar"

Теперь, когда я добавляю опцию -f, есть ли способ как-то показать только то, что я хочу? используя grep или другую технику?

user893730
источник
1
Похоже, ваш ответ уже написан здесь: stackoverflow.com/questions/5427483/…
uSlackr
1
Похоже, что XYR ответ находится в вопросе.
JdeBP

Ответы:

41

Вы почти написали ответ:

tail -f file.log | grep "foobar"

Вот и все.

Равашоль
источник
1
Вау, вы правы, я думаю, я не ожидал, что это сработает, я до сих пор этого не делаю, разве трубопровод не должен произойти, когда команда закончит выполнение? Я думаю, это показывает, что это не так, это происходит каждый раз, когда есть выход, верно?
user893730
3
Нет, он запустит две программы параллельно, а вторая (grep) закроется, как только закроется STDOUT tail. В этом весь смысл каналов, потоковых данных :)
Ravachol
4
Когда grepпоследняя строка в канале, ее выходные данные буферизуются, поэтому вы видите отфильтрованные выходные данные tail -f, а не задержанные. Обратите внимание, что если вы будете использовать несколько grepкоманд, любой из них, чей вывод был передан по конвейеру, будет нуждаться в --line-bufferedопции (предполагая GNU или BSD grep), чтобы сохранить это поведение.
Готи