хвост файл журнала, но показать только определенные строки


29

Я записываю файл журнала с флагом -f. Затем я добавляю это в grep, чтобы найти только строки, содержащие «X». Это прекрасно работает. Теперь я хочу снова передать это в другой grep, который удалит все строки, содержащие «Y». Когда я добавляю второй канал, файл перестает обновляться, и похоже, что данные не поступают.

Это команда, которая работает: tail -f my_file.log | grep "X"

Это команда, которая не: tail -f my_file.log | grep "X" | grep -v "Y"

Как мне структурировать это так, чтобы команда работала?


1
попробуйте сделать одну трубу за одну трубу, измените последовательность, сделайте tail -f file|grep -v "Y". если вывод в порядке, тогда продолжайте добавлять grep "X".
Айзуддин Зали

Ответы:


38

Поскольку выходные данные grepбуферизуются, используйте --line-bufferedопцию grepдля включения буферизации строк:

tail -f /path/to/log | grep --line-buffered 'X' | grep -v 'Y'

Если у вас grepнет опции, вы можете использовать stdbufв качестве альтернативы:

tail -f /path/to/log | stdbuf -oL grep 'X' | grep -v 'Y'

1
Мне интересно, как stdbufговорит, libstdbuf.soкакие настройки использовать.
Касперд

@kasperd: переменные окружения.
Нейт Элдредж

1
@NateEldredge Я уже искал переменные окружения в выходных данных diff -u <(env) <(stdbuf env)и не нашел ни одной. Но теперь я понимаю, что я должен был проверить diff -u <(env) <(stdbuf -oL env).
kasperd

Я тоже такая же проблема. В моем случае мне нужно напечатать все строки, содержащие «aaa» и «bbb». Над первым решением не работает. Второе решение работает для «ааа» существует и «BBB» не существует. оба существуют, не работают. не давая вывода. моя команда выглядит так: tail -f test.txt | stdbuf -oL grep 'aaa' | grep 'bbb' она не дает никакого вывода. Не могли бы вы мне помочь.
Вс

18

Я обычно нахожу более полезным awkдля такого рода логических проверок:

tail -f /path/to/log | awk '/X/ && !/Y/'
#                           ^^^    ^^^^
#                   this I want    but not this

Проверено наличием двух вкладок, одна из которых я продолжаю писать, seq 20 >> myfileа другая - например tail -f myfile | awk '/3/ && !/13/'.


15

Другой подход - использовать один grepвызов вместо двух, чтобы избежать проблемы с буферизацией. Просто используйте регулярные выражения, которые соответствуют строкам, состоящим из 0 или более не-Y символов, затем X и затем 0 или более не-Y до конца строки "

tail -f /path/to/log | grep '^[^Y]*X[^Y]*$'
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.