"tail -f <file>", переданный по адресу "grep -m1", не завершается в первом матче - PullRequest
0 голосов
/ 11 мая 2018

Скажите, у меня есть содержимое этого файла:

  1 lots
  2 of
  3 content
  4 above
  5
  6 My match string
  7 =======================
  8
  9 other
 10 content
 11 below

Я хочу номер строки "Моя строка соответствия".

Есть несколько фактов: (1). Соответствие строки происходит только один раз в файле. (2). Файл может не существовать при запуске моего скрипта. (3). Файл может быть очень большим, так как его генерация требует времени, и эта строка записывается только через несколько секунд после генерации.

Мой скрипт bash ДОЛЖЕН содержать команду для генерации файла с последующим поиском вышеуказанного номера строки:

Мой скрипт выглядит так:

<command to generate file>
if file exists 
    tail -f -n +1 my_log_file | grep "My match string" -nm1

Для больших файлов, для создания которых требуется время, эта команда работает. tail -f продолжает передавать содержимое в grep, и как только эта строка соответствия записывается в файл, -m1 успешно завершает grep (т.е. при первом совпадении).

Но для небольших файлов grep соответствует правильно и печатает совпадение, но не появляется, пока я не нажму ctrl + c

Почему эта разница в поведении, есть идеи, как это исправить? Спасибо

1 Ответ

0 голосов
/ 11 мая 2018

Избавьтесь от бесполезного tail.

Что происходит, так это то, что

  • grep существует, как и должно, но

  • tail -f не выйдет, пока не попытается что-то записать в канал и не заметит, что с него никто не читает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...