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

Используя замену процесса или путем группировки и передачи по каналу, можно передать вывод (stdout) ряд команд как вход для другой команды.

Пример:

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

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

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

Что-то как:

cat testfile | wc | tail -n 5

(Не берите конвейеры буквально). Здесь я пытаюсь передать вывод cat testfile обоим wc и tail -n 5

Другой пример был бы:

(для получения последнего слова предложения)

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

3 ответа

Быстрый ответ. Можно использовать tee >(what_to_do) >(another_thing_to_do) чтобы продолжать идти с Вашей командой для как много разных вещей, Вы хотите сделать.

Пример:

Исходный тестовый файл произвел:

:~$ cat testfile.txt 
Device Model:     LITEONIT LCS-256M6S 2.5 7mm 256GB
Serial Number:    TW0XFJWX550854187616

Вывод с tee команды добавляются:

:~$ cat testfile.txt | tee >(tail -1) >(wc) >(awk '{print $3,$1,$2}')
Device Model:     LITEONIT LCS-256M6S 2.5 7mm 256GB
Serial Number:    TW0XFJWX550854187616
LITEONIT Device Model:
TW0XFJWX550854187616 Serial Number:
      2      10      91
Serial Number:    TW0XFJWX550854187616

Каждая команда в мишени является просто нормальными командами, которые Вы использовали бы на командной строке, как включают >(head -1 | wc) работы также.

:~$ cat testfile.txt | tee >(tail -1) >(head -1 | wc)  >(awk '{print $3,$1,$2}')
Device Model:     LITEONIT LCS-256M6S 2.5 7mm 256GB
Serial Number:    TW0XFJWX550854187616
      1       7      52
LITEONIT Device Model:
TW0XFJWX550854187616 Serial Number:
Serial Number:    TW0XFJWX550854187616

Или можно также захватить последнее слово, говорят что последняя строка при помощи awk с $NF с a wc также как это:

:~$ cat testfile.txt | tail -1 | tee >(wc) >(awk '{print $NF}')
Serial Number:    TW0XFJWX550854187616
TW0XFJWX550854187616
      1       3      39

Примечание: Добавление a | передайте команду по каналу, в конец может переопределить использование нескольких команд от tee команда. У меня есть некоторые примеры здесь, что я тестировал:

Пример 1 (Команда канала, вытягивающая все последние слова):

:~$ echo "This is just five words" | tee >(wc -l) >(wc -w) >(wc -c) | awk '{print $NF}'
words
24
5
1

Пример 2 (Не показывает вывод команд туалета. Команда канала, захватывая 3-е слово.):

:~$ echo "This is just five words" | tee >(wc -l) >(wc -w) >(wc -c) | awk '{print $3}'
just

Пример 3 (Захват 3-го слова строки эха. Команда Tee.):

:~$ echo "This is just five words" | tee >(wc -l) >(wc -w) >(wc -c) >(awk '{print $3}')
This is just five words
just
24
5
1

Пример 4 (Захват последнего слова строки эха. Команда Tee.):

:~$ echo "This is just five words" | tee >(wc -l) >(wc -w) >(wc -c) >(awk '{print $NF}')
This is just five words
words
24
5
1

Надеюсь, это поможет!

21
ответ дан 23 November 2019 в 01:48

Вам нужно 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 November 2019 в 01:48

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

Для Вашего первого примера, Вы использовали бы:

cat testfile | pee wc "tail -n 5"

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

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

5
ответ дан 23 November 2019 в 01:48

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

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