Я хотел бы сделать что-то эквивалентное этому
some-expensive-command > /tmp/mytempfile
grep -v "pattern" /tmp/mytempfile >> output.txt
grep "pattern" /tmp/mytempfile | yet-another-command
предпочтительно изящный и без потребности в tempfile
. Я думал о передаче по каналу через tee
, но лучшее, о котором я могу думать, могло бы объединить две из этих трех строк и все еще потребовать промежуточного устройства хранения данных:
some-expensive-command | tee /tmp/mytempfile | grep -v "pattern" >> output.txt
grep "pattern" /tmp/mytempfile | yet-another-command
Путем вопрос читает, он кажется на желание одного stdin, перенаправленного к двум различным командам. Если это так, использовать в своих интересах tee
плюс замена процесса:
some-expensive-command | tee >(grep 'pattern' > output.txt) >(grep -v 'pattern' | another-command)
Другой способ посмотреть на это путем распознавания этого grep
инструмент сопоставления с образцом строки, таким образом, путем чтения строки за один раз и использования той же самой строки в нескольких командах мы можем достигнуть точно того же эффекта:
rm output.txt # get rid of file so that we don't add old and new output
some-expensive-command | while IFS= read -r line || [ -n "$line" ]; do
printf "%s\n" "$line" | grep 'pattern' >> output.txt
printf "%s\n" "$line" | grep -v 'pattern' | another-command
done
# or if another-command needs all of the output,
# place `| another-comand` after `done` clause
Иначе должен отказаться grep
и используйте что-то более мощное, как awk
:
some-expensive-command | awk '/pattern/{print >> "output.txt"}; !/pattern/{print}' | another-command.
В сущности не волнуйтесь об использовании временных файлов, пока Вы очищаете их после использования. Если это работает, это работает.
Использовать bash
Замена процесса:
some-command | tee >(grep "pat" | another-command >>out1) | grep -v "pat" >>out2
Замена процесса присваивается some-command
вывод к grep "pat"
вход, таким образом сохраняя Вас tempfile. Конечно, данные все еще сохраняются в файле (это всегда), просто что Вы не должны заботиться об этом. Если Вы не хотите сохранять another-command
вывод в файле, а скорее печати это я рекомендую просто переключить эти два списка команд.
Другой хороший источник информации: man bash
/ РАСШИРЕНИЕ