как разделить вход к двум каналам

Я хотел бы сделать что-то эквивалентное этому

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
2
задан 18 November 2018 в 01:07

2 ответа

Путем вопрос читает, он кажется на желание одного 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.

В сущности не волнуйтесь об использовании временных файлов, пока Вы очищаете их после использования. Если это работает, это работает.

3
ответ дан 2 December 2019 в 02:12

Использовать bash Замена процесса:

some-command | tee >(grep "pat" | another-command >>out1) | grep -v "pat" >>out2

Замена процесса присваивается some-commandвывод к grep "pat"вход, таким образом сохраняя Вас tempfile. Конечно, данные все еще сохраняются в файле (это всегда), просто что Вы не должны заботиться об этом. Если Вы не хотите сохранять another-commandвывод в файле, а скорее печати это я рекомендую просто переключить эти два списка команд.

Другой хороший источник информации: man bash/ РАСШИРЕНИЕ

1
ответ дан 2 December 2019 в 02:12

Другие вопросы по тегам:

Похожие вопросы: