Obtenha todos os processos cujos nomes contenham firefox
e excluam grep
o processo. Não adianta mostrar todos os processos aqui, omita muitas linhas.
ps aux | grep [f]irefox
debian 7069 1.0 4.4 3134148 359168 ? Sl 11:58 0:12 /usr/lib/firefox-esr/firefox-esr
debian 7128 0.0 0.4 223884 36824 ? Sl 11:58 0:00 /usr/lib/firefox-esr/firefox-esr -contentproc -parentBuildID 20241118130310 -prefsLen 28341 -prefMapSize 249085 -appDir /usr/lib/firefox-esr/browser {0c853969-95e1-4db0-9e95-eeaee3d4f814} 7069 true socket
A saída não contém informações de cabeçalho no ps
comando 's, para obter o cabeçalho, adicione head -n1
após o pipe.
ps aux |(head -n 1 ;grep [f]irefox)
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
debian 7069 0.9 4.4 3134148 361740 ? Sl 11:58 0:13 /usr/lib/firefox-esr/firefox-esr
debian 7128 0.0 0.4 223884 36824 ? Sl 11:58 0:00 /usr/lib/firefox-esr/firefox-esr -contentproc -parentBuildID 20241118130310 -prefsLen 28341 -prefMapSize 249085 -appDir /usr/lib/firefox-esr/browser {0c853969-95e1-4db0-9e95-eeaee3d4f814} 7069 true socket
Outro comando bash:
df
Filesystem 1K-blocks Used Available Use% Mounted on
udev 3977796 0 3977796 0% /dev
tmpfs 804900 1356 803544 1% /run
/dev/sdb1 460349516 143209832 293681076 33% /
tmpfs 4024488 100444 3924044 3% /dev/shm
tmpfs 5120 16 5104 1% /run/lock
df | grep shm
tmpfs 4024488 101536 3922952 3% /dev/shm
df |(head -n1; grep shm)
Filesystem 1K-blocks Used Available Use% Mounted on
Por que não consigo obter a saída abaixo ao executar df |(head -n1; grep shm)
?
df |(head -n1; grep shm)
Filesystem 1K-blocks Used Available Use% Mounted on
tmpfs 4024488 101536 3922952 3% /dev/shm
Por que grep em "ps aux |(head -n 1 ;grep [f]irefox)" pode obter linhas correspondentes?
Como user10489
apontam os especialistas:
The command df |(head -n1; grep shm) does this:
df generates some output
head takes all of the output, prints the first line, and then quits throwing away all the rest of what it read.
There is no output left for grep to take as input.
Outro post pode explorá-lo em profundidade:
cat > raw.txt <<EOF
ID DESCRIPTION
----- --------------
2 item2
4 item4
1 item1
3 item3
EOF
Quero obter as linhas abaixo classificadas com cabeçalho:
ID DESCRIPTION
----- --------------
1 item1
2 item2
3 item3
4 item4
Gilles Quénot
obtenha uma solução simples - solução simples
{ head -2; sort -n; } <raw.txt
Quando o comando em {}
obter redirecionamento de entrada por <raw.txt
, se head -2;
executado como user10489
digamos: head takes all of the output, prints the first line, and then quits throwing away all the rest of what it read.
, por que sort -n
ter linhas para classificar?
O resultado seria
ID DESCRIPTION
----- --------------
Nenhuma linha classificada!!!
Isso não funciona porque os canos não funcionam dessa maneira.
O comando
df |(head -n1; grep shm)
faz isso:Mesmo que o head não leia todos os dados, ele vai ler um buffer cheio, que quase nunca será exatamente uma linha, e não tem como dar a entrada restante de volta para alimentá-la ao próximo comando. Não é assim que os pipes funcionam, e não é assim que o buffer de entrada funciona. E implementá-lo de forma diferente não seria eficiente. Então sempre haverá alguns dados faltando que o segundo comando não vê, potencialmente dando respostas incompletas.
O comando alternativo na outra resposta é a maneira correta de fazer isso, em vez de esperar que os dados em um pipe sejam divididos mágica e perfeitamente entre dois comandos.
Aqui está um exemplo mais repetível:
Isso funciona da seguinte maneira:
Fazendo algumas contas, faltam 355 linhas, ou (23 caracteres por linha) pelo menos 8165 caracteres.
Presumindo um tamanho de buffer típico de 8192, 23 caracteres foram impressos para a primeira linha, e outros 4 caracteres foram consumidos no início da última linha (incompleta) naquele buffer, deixando 1644 linhas para wc, com a primeira curta.
Para a parte do porquê , @user10489 deu uma resposta .
Usando
awk
:NR==1
é comohead -n1
e/shm/
é comogrep shm
Se
awk
ler toda a entrada, ele não encontra o problema de buffering. Ele pode, portanto, seletivamente canalizar tudo depois do cabeçalho parasort
viaawk
pipe.Não tenho muito
shm
, mas gosto de relatar minhas partições em sequência, assim comops
a saída.Prolixo, mas talvez valha a pena declarar como uma função em
.bashrc
.Na verdade,
bash
ele lê linhas sem buffer, então algo assim também funciona:Usando
grep
expressões regulares de , pode-se:que corresponde a linhas que contêm '
shm
' OU '1K-blocks
'1.
{ head -2; sort -n; } <raw.txt
pode funcionar, aqui está o motivo: redirecionamento e pipe .2.Por que
ps aux |(head -n 1 ;grep [f]irefox)
pode funcionar?Buffer importa.
user10489
A opinião de está correta: "basicamente, a saída do ps aux é maior, então ele preenche o buffer do head".Para o comando
ps aux |(head -n 1 ;grep [f]irefox)
, parece que aps aux
saída de muitas linhas preenche muitas páginas,head -n 1
lê somente a primeira página no buffer, o conteúdo cujo número de linha é maior que 1 na primeira página seria lido; outras informações sem na primeira página passadas paragrep
corresponder.Conte o tamanho em uma página:
Uma linha aqui contém 23 caracteres:
Então:
3. Escreva o título e adicione a linha correspondente.