Как я могу объединить эти две команды ps aux | head -n1 ; ps aux | grep vlc
в одну команду? Я пытался использовать tee
команда (ps aux | tee >(head -n1) >(grep vlc)
) но это не работало!
Таким образом, Вы пытаетесь сохранить главу команды 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
, почему не был бы Вы?
Можно сказать 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
Используйте 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
Я использовал бы
ps aux | grep -E '^USER|vlc'
, можно добавить | grep -v grep
для исключения grep строки
Просто скажите 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
заголовок и только строки, о которых Вы заботитесь.