Остановка после первой строки вывода

Я пытаюсь сделать следующее в скрипте Bash: запустить команду (например, tail -f log_file), дождитесь прибытия определенного вывода, затем остановите команду и продолжите работу со сценарием.

Я попробовал следующее, но это не сработало:

tail -f log_file | grep some_text | head -n1

У меня нет выхода таким образом.

Теперь я попытался диагностировать проблему. Когда я просто бегу tail -n1, затем введите что-то в терминал, оно выходит после первой строки. Однако, если я запускаю следующее:

grep some_text | head -n1

В этом случае я не получаю вывод, пока я не нажму CTRL+D, а затем он напечатает первую строку ввода, содержащую some_text,

Мой вопрос, почему это? Если head выводит первую строку сразу в первом случае, почему не получается, когда он получает входные данные из канала? Разве он не должен выводить все для первых n строк, а затем выходить, посылая сигнал SIGPIPE на другой конец канала?

2 ответа

Решение

grep буферизует ваш ввод Пытаться grep --line-buffered,

Есть дополнительная проблема, head завершится только после получения второй строки, которая может быть проблемой, если ваш файл журнала низкочастотный. См. Как прочитать одну строку из tail -f через конвейер, а потом прекратить?,

Когда ты бежишь tail -n1 без ввода, он выйдет после первой строки ввода из STDIN, вот как это должно работать. Когда ты бежишь grep some_text | head -n1 вы опять не предоставляете никакой информации grepТаким образом, может показаться, что поведение, которое вы описываете, является нормальным. Когда вы нажимаете CTRL D, вы закрываете канал STDIN, и head -n1 выводит то, что `grep получил от STDIN.

Другие вопросы по тегам