Иногда нужно одновременно: подавать данные в программу, анализировать ее вывод, логировать поток, фильтровать часть данных и все это без временных файлов. Такое легко делается через tee + process substitution.
▪️ Базовый шаблон
cat input.log \
| cmd \
| tee >(grep "ERROR" > errors.log) \
| awk '{print $1, $3}'
cmd принимает stdin от cat;tee дублирует поток: в файл-поток >(grep ...) и дальше в awk;grep работает параллельно, не мешая основному пайпу;и при этом нет temp-файлов, все идёт по fd
▪️ Пример 1: анализ, логирование и фильтрация сразу. Извлекаем ошибки в отдельный файл, а общий вывод обрабатываем:
journalctl -u nginx \
| tee >(grep 500 >500.log) \
| awk '/request/ {print $NF}'
▪️ Пример 2: split-поток для алертов и статистики
tail -F app.log \
| tee >(grep CRITICAL | notify-send "ALERT!") \
| awk '{count[$5]++} END {for (i in count) print i, count[i]}'
▪️ Пример 3: читаем и пишем в интерактивный процесс. Двунаправленная работа с программой:
coproc APP { cmd --interactive; }
echo "status" >&"${APP[1]}"
cat <&"${APP[0]}" \
| tee >(grep ALERT >alerts.log) \
| awk '{print "OUT:", $0}'
Работает как мини-оркестратор для интерактивного ввода/вывода.
BashTex 📱 #bash #utils