Você está tentando preservar a cabeça do comando PS (assim você pode ver os cabeçalhos), mas mostra apenas os comandos vlc .
Eu pessoalmente usaria apenas awk e filtrar com base em duas condições, o número da linha e o VLC. Se um deles for verdadeiro, nós geramos a linha:
$ ps aux | awk 'NR==1 || ~/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
Tem a vantagem adicional de estar executando apenas ps uma vez. E como o campo 11 é o comando principal (não qualquer um dos seus argumentos), também não capturaremos o comando awk que está sendo executado. Acabamos de obter o VLC e os cabeçalhos das colunas.
Em uma barra lateral, algo como isso deve funcionar ... mas não ...
ps aux | tee >(head -1 >&2) | grep vlc
Você estava perto, você precisava canalizar para o último comando ou tee vai se desentender sobre STDOUT, e se você enviar para STDOUT e depois para pipe, é provável que ele seja capturado no último grep . No acima, eu imprimo os cabeçalhos em STDERR (2) para impedir que grep interfira nele. Bit hacky mas hey-ho.
Mas sim, isso ainda não funciona . O motivo é que head fecha o STDOUT , que filtra de volta para tee e detém o grep . Isso ocorre por design, portanto, head não processa mais entradas do que o necessário. Você pode simular o que está fazendo com awk :
$ ps aux | tee >(awk 'NR==1 {print;exit}' >&2) | grep "grep"
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
Isso é equivalente a head -1 . Ele encontra a primeira linha e depois sai. Isso elimina o buffer de entrada e tee falha.
Aqui está uma versão em que awk não sai depois de encontrar a primeira linha. Vai continuar correndo (coisa boa ou não) sobre cada linha:
$ 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
Outra alternativa é enviar a entrada para sponge . O Sponge absorve todo o fluxo de entrada antes de gravá-lo em um arquivo (ou ser redirecionado). Isso impede que a cabeça elimine o fluxo pai, mas significa que a entrada será invertida (o grep será a saída primeiro), então vamos passar por uma instância sponge também:
$ 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
Mas enquanto esses dois segundos funcionam, e você está gerando apenas ps aux de saída, eles ainda têm sérios problemas . O awk|grep está processando tudo duas vezes e o sponge orgy está armazenando tudo duas vezes.
tl; dr : Se você puder processar tudo em um comando como você pode com awk , por que você não faria isso?