Используя замену процесса или путем группировки и передачи по каналу, можно передать вывод (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)
Быстрый ответ. Можно использовать 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
Надеюсь, это поможет!
Вам нужно 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}'
moreutils
пакет обеспечивает команду pee
(слияние канала и мишени, что Вы думали?), который делает точно это.
Для Вашего первого примера, Вы использовали бы:
cat testfile | pee wc "tail -n 5"
второй пример более сложен, потому что Вы хотите передать два исходных данные последней команде. Я, вероятно, использовал бы awk
в качестве других ответов.