Быстрый ответ. Вы можете использовать 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
Каждая команда в tee - это обычные команды, которые вы используете в командной строке, например, add in >(head -1 | wc)
works.
:~$ 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
с wc
а так:
:~$ cat testfile.txt | tail -1 | tee >(wc) >(awk '{print $NF}')
Serial Number: TW0XFJWX550854187616
TW0XFJWX550854187616
1 3 39
ПРИМЕЧАНИЕ. Добавление |
в конец команды pipe может быть отменено с помощью нескольких команд из tee
команды. У меня есть несколько примеров, которые я тестировал:
Пример 1 (команда Pipe извлекает все последние слова):
:~$ echo "This is just five words" | tee >(wc -l) >(wc -w) >(wc -c) | awk '{print $NF}'
words
24
5
1
Пример 2 (Не показывает вывод команд wc. Команда pipe захватывает 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
является ложным. Причина, по которой вы обычно получаете правильный заказ, заключается в том, что на компьютере с низкой нагрузкой первым запускается первый потребительский процесс. На более загруженной машине первого потребителя можно усыпить, прежде чем он сможет что-либо напечатать.tee
понятия не имеет о потребителях - они создаются тем,bash
кто обрабатывает линию. Все, чтоbash
нужно, это скопировать дескрипторы открытого файла. Кроме того, у вас есть несколько потребителей, пишущих в файловые дескрипторы, открытые в одном и том же файле. Ядро позаботится об этом, но, конечно, порядок, в котором они появились вbash
командной строке, не будет иметь значения.Вам нужно
tee
разделить поток на части. Пытаться:Примечания:
Если несколько процессов (
wc
,tail
) все пишут в стандартный вывод:Вы можете получить искаженный вывод.
Нет никакой гарантии в том порядке, в котором они появятся. Чтобы увидеть это, попробуйте
sleep 1; wc -w
в качестве второго потребителя.tee
заблокирует, если какой-либо из его пунктов назначения не потребляет поток достаточно быстро. Это означает, что получатели будут получать ввод с примерно одинаковой скоростью (по модулю буферизации фиксированного размера). Это не легко исправить, единственная альтернатива - сохранить поток в файл и раздать его потребителям отдельно. Ибоwc
иtail
это не проблема.Для последнего слова проще сделать:
источник
moreutils
Пакет предоставляет командуpee
(слияние трубы и тройник, что же вы думаете?) , Который делает именно это.Для первого примера вы бы использовали:
Второй пример более сложный, потому что вы хотите передать два ввода последней команде. Я бы, вероятно, использовал
awk
в качестве других ответов.Ссылка: https://joeyh.name/code/moreutils/
источник