Intereting Posts
Запрос текущего времени города с терминала данные восстановления из RAID и сбоя диска (Linux) Альтернатива xmllint для проверки правильности xml Распечатайте n строк до и m строк после совпадения с pdfgrep Добавление префиксов / суффиксов в имена файлов без их повторного ввода? `xinit / usr / bin / firefox` vs` xinit firefox` Не удалось добавить ключ к gpg Почему rpm не может использовать xterm? Как я могу запустить команду, если отключен служебный модуль systemd? Являются ли управляющие последовательности терминального цвета определенными где угодно для bash? Microsoft LifeCam VX-800 прекратила работу над Linux Mint offlineimap: Как предотвратить перемещение перемещаемых сообщений по мере их появления после синхронизации? Как включить ядро ​​для загрузки платы Intel® Wireless 7260 на NUC DC3217IYE с помощью Debian 7? Обнаружение видеокарты NVIDIA GTX860M в Manjaro Linux? начать процесс (как root) при входе пользователя в систему

используя stdout дважды (но не tee, как я знаю)

У меня есть вопрос, связанный с тем, как fork stdout в двух направлениях, но с другим завихрением. (Я уже знаю о тройнике! 🙂

Я хотел бы, чтобы вывод отображался как (tee to console?) И был перенаправлен на дополнительную доработку.

Пример: у меня есть

ps -ef | grep -i something 

теперь я хочу, чтобы оба увидели этот результат и уточнили его, например, с помощью

 | awk '{print "epwdx "$2}' 

Конечно, я могу последовательно выполнять две команды и фиксировать все результаты, но иногда я хотел бы запускать их как единицу, возможно, увеличивая вероятность того, что они расскажут о постоянной текущей истине.

Возможно, есть способ использовать другие трюки (например, -, 2>, & 2 и т. Д.), Но я пока не вижу их.

Если вы хотите вывести вывод из середины трубы в терминал, вы можете использовать его /dev/tty (или /dev/stderr ).

Это должно печатать вывод something на терминал и направлять то же самое через somefilter в выходной файл.

 somecmd | tee /dev/tty | somefilter > output 

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

Хотя, если все, что вы хотите, это отфильтровать набор процессов, показанных ps , или полей, которые он печатает, у программы также есть встроенные опции. См. Руководство для «Выбор процесса», «Формат вывода» и «Форматы спецификаций».

Как я уже сказал (почти) в комментарии, вы можете использовать что-то вроде этого:

 ps -ef | grep -i something | tee /dev/stderr | awk '{print "epwdx "$2}' 

Тем не менее, также возможно изменить команду awk , особенно если вы используете GNU awk ( gawk ), с чем-то подобным, что устраняет необходимость в grep :

 ps -ef | awk ' BEGIN {IGNORECASE=1} /something/ { print ">> Matched 'something' here:", $0; print "epwdx "$2 } ' 

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

Вы можете использовать pee если у вас есть:

моча похожа на тройник, но на трубы. Каждая команда запускается и подается копия стандартного ввода. Вывод всех команд отправляется в стандартный вывод. Обратите внимание, что, хотя это похоже на tee, копия входа не отправляется в stdout, как это делает tee.

Кажется, вам придется неявно указать команду, которая копирует вход в STDOUT:

 ps -ef | pee "cat" "grep -i something" 

Вы можете использовать tee с заменой процесса, например

 ps -ef | grep -i something | tee >(awk '{print "epwdx "$2}') 

хотя я думаю, что @roaima предоставила хорошее, все awk решение, которое, вероятно, лучший способ пойти

Насколько я знаю, это невозможно сделать только с файловыми дескрипторами, и кажется, что трюк, предлагаемый с tee >/dev/tty , достаточен для выполнения вашей работы.

Просто для обмена информацией, я делаю эту работу с функцией в моем профиле bash следующим образом:

 function teee { a="$(</dev/stdin)";echo -e "pipe in\n$a\npipe out\n" >/dev/stderr; echo "$a"; } 

Тестирование:

 $ cat file11 |teee|grep -Po '[A-Za-z]+[\s|\w]+,\s[0-9]+' file11 | teee |awk '{print $2}' pipe in Ubuntu, 120, 143, 154 Yggdrasil, 144, 170-171 Yood, Charles, 6 We Were Young, Bob, 178-179 Zawinski, Jamie, 204 pipe out pipe in Ubuntu, 120 Yggdrasil, 144 Charles, 6 Bob, 178 Jamie, 204 pipe out 120 144 6 178 204