grep не прекращает отправку данных в строку - PullRequest
0 голосов
/ 08 мая 2019

У меня есть очень простой скрипт, который сканирует файл на наличие строки и, если он находит ее, отправляет эту строку в файл. Моя проблема в том, что команда зацикливается вечно, и я не вижу логической причины.

key=0
while [ $key = 0 ]
  do
     if [ $key = 0 ]
      then
      tail -1 /home/user/testfile | grep -i string >> holder
      key=1
        else
        key=0
     fi
 done

Я хочу, чтобы скрипт сканировал testfile на строку, пока не найдет ее, но сейчас он не останавливается, когда находит строку, он просто продолжает посылать строку в файл-держатель.

1 Ответ

1 голос
/ 08 мая 2019

Хорошо, всего переписать.

while read line
do case "$line" in
   *string*) echo "$line"
             break ;;
   esac
done < <( tail -99999f testfile ) >> holder

tail контролирует скорость подачи. Требуется несколько строк, если в файле есть какие-либо данные, которые вы хотите проверить, когда начинается цикл; число, которое я использовал, является произвольным. -f будет следовать за концом файла, передавая новые данные по мере его поступления.

read не самая эффективная из возможных систем, но здесь она помогает с проблемами буферизации, поэтому я думаю, что это уместно.

case - это простое сравнение строк, которое заменяет grep, не вызывая процесс в каждой строке. Это должно быть довольно эффективно и не требует таких регуляторов, как sleep - оно будет соответствовать tail настолько хорошо, насколько это возможно, а затем будет выполнено за один проход.

... хотя он и работает tail. Я ожидал, что это закроется, когда никто не читал трубку. Хм ...

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