Как "протащить" пайплайн через несколько процессов?

Надо вытащить с лога записи за последние несколько минут. Написал bash-скрипт для этого:

d=$(date --date='5 min ago' '+%Y-%m-%d %H:%M:%S'); echo $d; tac log.log | (while read -r line; do ([[ $line =~ (^[0-9]{4}-[0-9]{2}-[0-9]{2}) && $d > $line ]] && (break)) || echo $line; done;) | tac -

Закладывал такую логику:

  1. Читаем файл с конца
  2. Дочитываем до какой-то определенной строки.
  3. Вывод из 2 передаём обратно в tac, чтобы "перевернуть" вывод обратно.

Но break здесь не выполняется (захватываются лишние строки). bash я знаю очень плохо, как удалось нагуглить, причина в том, что с помощью | "плодятся" процессы и по факту в цикл попадает несколько потоков. Решением здесь будет передавать пайплайн через <. Вот тут возникли проблемы. Не совсем понимаю, как это сделать.
Пробовал такие варианты:

d=$(date --date='5 min ago' '+%Y-%m-%d %H:%M:%S'); echo $d; tac <(while read -r line; do ([[ $line =~ (^[0-9]{4}-[0-9]{2}-[0-9]{2}) && $d > $line ]] && (break)) || echo $line; done;) <tac <log.log

Получаю tac: No such file or directory.

d=$(date --date='4 min ago' '+%Y-%m-%d %H:%M:%S'); echo $d; { tac | (while read -r line; do ([[ $line =~ (^[0-9]{4}-[0-9]{2}-[0-9]{2}) && $d > $line ]] && (break)) || echo $line; done;) | tac } < log.log

Тут процесс вообще блокируется.


Ответы (0 шт):