Как передать вывод одной команды нескольким командам?

Использование замещения процесса или группировка & amp;

Пример:

wc < <(echo hi;echo bye)
(echo hi; bye) | wc

Но есть ли что-то противоположное?

То есть, есть способ отправить вывод одной команды в качестве входа для многих других команд в Но есть ли противоположность? ?

Что-то вроде:

cat testfile | wc | tail -n 5

( stdout ). Здесь я пытаюсь передать вывод cat testfile на оба wc и tail -n 5

. Другим примером может быть:

(чтобы получить последнее слово предложения)

echo "some random words"| wc -c | cut -f(out put of wc -c) (output of first echo)
1
задан 4 October 2016 в 22:00

2 ответа

Вам нужно tee разделить поток на части. Попробуйте:

cat testfile | tee >(wc -l) >(wc -w) >(wc -c) | tail -n 5

Примечания:

Если несколько процессов (wc, tail) все записывают в stdout: вы можете получить искаженный вывод. Нет гарантии о том, как будет выглядеть их выход. Чтобы увидеть это, попробуйте sleep 1; wc -w как второго потребителя. tee заблокирует, если какое-либо из его пунктов назначения не будет потреблять поток достаточно быстро. Смысл, адресаты будут подаваться на вход с примерно одинаковой скоростью (по модулю буферизации фиксированного размера). Для этого нет простого решения, единственной альтернативой является сохранение потока в файл и его передача потребителям отдельно. Для wc и tail это не проблема.

Для последнего слова это проще:

echo "some random words" | awk '{print $NF}'
17
ответ дан 23 May 2018 в 05:30

Пакет moreutils предоставляет команду pee (слияние трубы и тройника, что вы думаете?), которая делает именно это.

Для вашего первого примера вы бы использовали: [ ! d1]

cat testfile | pee wc "tail -n 5"

Второй пример более сложный, потому что вы хотите передать два входа в последнюю команду. Я бы, вероятно, использовал awk в качестве других ответов.

Ссылка: https://joeyh.name/code/moreutils/

3
ответ дан 23 May 2018 в 05:30

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

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