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

4406
petersohn

Я пытаюсь сделать следующее в скрипте 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 на другой конец канала?

3
Я не уверен, что следую этому очень хорошо. Вы получите вывод, если выполните `tail -f log_file | grep some_text` Kirk 13 лет назад 0
Я получаю вывод только в конце входного потока. Когда я не использую grep, я сразу получаю вывод. Кроме того, если я использую grep, но без головы, я тоже получаю вывод немедленно. petersohn 13 лет назад 0
Возможный дубликат: http://superuser.com/questions/275827/how-to-read-one-line-from-tail-f-through-a-pipeline-and-then-terminate peth 13 лет назад 0

2 ответа на вопрос

2
peth

grepбуферизует ваш ввод Попробуй grep --line-buffered.

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

0
Kirk

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

Похожие вопросы