Объедините две команды в одну команду

Как я могу объединить эти две команды ps aux | head -n1 ; ps aux | grep vlc в одну команду? Я пытался использовать tee команда (ps aux | tee >(head -n1) >(grep vlc)) но это не работало!

4
задан 16 September 2015 в 02:04

5 ответов

Таким образом, Вы пытаетесь сохранить главу команды PS (таким образом, Вы видите заголовки), но только покажите vlc команды.

Я лично просто использовал бы awk и фильтр на основе двух условий, номера строки и VLC. Если любой верен, мы производим строку:

$ ps aux | awk 'NR==1 || $11~/vlc/'
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
oli       4833  0.6  0.2 795220 62952 ?        Sl   15:37   0:00 /usr/bin/vlc

Это имеет добавленное преимущество, которое Вы только выполняете ps однажды. И потому что поле 11 является основной командой (не любой из ее аргументов), мы не получим awk команда выполняется также. Мы просто получаем VLC и заголовки столбцов.


На боковой панели что-то вроде этого должно работать..., но не делает...

ps aux | tee >(head -1 >&2) | grep vlc

Вы были близки, необходимо было передать по каналу в последнюю команду или tee будет грязное пятно по STDOUT, и если Вы производите к STDOUT и затем передаете по каналу, возможности, это будет оказываться в последнем grep. В вышеупомянутом я произвел заголовки в STDERR (2) для остановки grep вмешательство с ним. Бит hacky, но эй-ho.

Но да, это все еще не работает. Причина - это head STDOUT завершений, который фильтрует назад к tee и фиксации grep. Это дизайном так head не обрабатывает более вход, чем он должен. Можно моделировать то, с чем это делает awk:

$ ps aux | tee >(awk 'NR==1 {print;exit}' >&2) | grep "grep"
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND

Это эквивалентно head -1. Это находит первую строку и затем выходит. Это уничтожает входной буфер, и tee зеркальные отражения.

Вот версия где awk не выходит после того, как это найдет первую строку. Это будет продолжать бежать (хорошая вещь или не) по каждой строке:

$ ps aux | tee >(awk 'NR==1' >&2) | grep "grep"
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
oli      15103  0.0  0.0  11752  2236 pts/18   S+   11:32   0:00 grep --color=auto grep

Другая альтернатива отправляет вход в sponge. Губка впитывает целый входной поток прежде, чем записать это в файл (или быть перенаправленной). Это останавливает голову, уничтожающую родительский поток, но это действительно означает, что вход будет инвертирован ( grep произведет сначала), таким образом, мы продвинем это через a sponge экземпляр также:

$ ps aux | tee >(sponge >(head -1 >&2)) | sponge >(grep "grep")
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
oli      14875  0.0  0.0  11752  2192 pts/18   S    11:19   0:00 grep --color=auto grep

Но в то время как эти вторые два и работают, и Вы только генерируете ps aux вывод однажды, они все еще у обоих есть серьезные проблемы. awk|grep обрабатывает все дважды и sponge оргия буферизует все дважды.

tl; доктор: Если можно обработать все это в одной команде как Вы, может с awk, почему не был бы Вы?

19
ответ дан 23 November 2019 в 11:34

Можно сказать ps печатать только идентификаторы процесса vlc с -C.

От man ps:

   -C cmdlist
          Select by command name.  This selects the processes whose
          executable name is given in cmdlist.

Пример:

$ ps u -C vlc
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
sylvain  12586  0.1  0.3 1076848 60908 ?       Sl   20:10   0:00 /usr/bin/vlc
8
ответ дан 23 November 2019 в 11:34

Используйте bash замена процесса и cat:

cat <(ps aux | head -1) <(ps aux | grep '[v]lc')

шаблон замены процесса <() замены вывод команды в нем как файл. cat будет простой связывать файлы, как обычно.

Пример:

$ cat <(ps aux | head -1) <(ps aux | grep '[v]lc')
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
chayan   26031  2.3  0.4 1098532 38556 pts/31  Sl   20:45   0:00 vlc
7
ответ дан 23 November 2019 в 11:34

Я использовал бы

ps aux | grep -E '^USER|vlc'

, можно добавить | grep -v grep для исключения grep строки

6
ответ дан 23 November 2019 в 11:34

Просто скажите ps только показывать вывод для vlc:

$ ps -P $(pgrep vlc)
PID PSR TTY      STAT   TIME COMMAND
6728   2 pts/0    Sl     0:00 vlc

pgrep списки PIDs любых процессов, имя которых соответствует данному шаблону. PS -P переключатель позволяет Вам перечислить информацию только для определенного PIDs. Объединение этих двух дает Вам ps заголовок и только строки, о которых Вы заботитесь.

6
ответ дан 23 November 2019 в 11:34

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

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