Как "протащить" пайплайн через несколько процессов?
Надо вытащить с лога записи за последние несколько минут. Написал 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 -
Закладывал такую логику:
- Читаем файл с конца
- Дочитываем до какой-то определенной строки.
- Вывод из 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
Тут процесс вообще блокируется.