Я записываю файл журнала с флагом -f. Затем я добавляю это в grep, чтобы найти только строки, содержащие «X». Это прекрасно работает. Теперь я хочу снова передать это в другой grep, который удалит все строки, содержащие «Y». Когда я добавляю второй канал, файл перестает обновляться, и похоже, что данные не поступают.
Это команда, которая работает: tail -f my_file.log | grep "X"
Это команда, которая не: tail -f my_file.log | grep "X" | grep -v "Y"
Как мне структурировать это так, чтобы команда работала?
command-line
grep
Ори Хорев
источник
источник
tail -f file|grep -v "Y"
. если вывод в порядке, тогда продолжайте добавлятьgrep "X"
.Ответы:
Поскольку выходные данные
grep
буферизуются, используйте--line-buffered
опциюgrep
для включения буферизации строк:Если у вас
grep
нет опции, вы можете использоватьstdbuf
в качестве альтернативы:источник
stdbuf
говорит,libstdbuf.so
какие настройки использовать.diff -u <(env) <(stdbuf env)
и не нашел ни одной. Но теперь я понимаю, что я должен был проверитьdiff -u <(env) <(stdbuf -oL env)
.tail -f test.txt | stdbuf -oL grep 'aaa' | grep 'bbb'
она не дает никакого вывода. Не могли бы вы мне помочь.Я обычно нахожу более полезным
awk
для такого рода логических проверок:Проверено наличием двух вкладок, одна из которых я продолжаю писать,
seq 20 >> myfile
а другая - напримерtail -f myfile | awk '/3/ && !/13/'
.источник
Другой подход - использовать один
grep
вызов вместо двух, чтобы избежать проблемы с буферизацией. Просто используйте регулярные выражения, которые соответствуют строкам, состоящим из 0 или более не-Y символов, затем X и затем 0 или более не-Y до конца строки "источник