AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 791084
Accepted
showkey
showkey
Asked: 2025-02-15 12:30:27 +0800 CST2025-02-15 12:30:27 +0800 CST 2025-02-15 12:30:27 +0800 CST

Por que não é possível adicionar o cabeçalho na saída do df?

  • 772

Obtenha todos os processos cujos nomes contenham firefoxe excluam grepo 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 pscomando 's, para obter o cabeçalho, adicione head -n1apó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 user10489apontam 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énotobtenha 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 user10489digamos: 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 -nter linhas para classificar?
O resultado seria

ID         DESCRIPTION
-----      --------------

Nenhuma linha classificada!!!

bash
  • 5 5 respostas
  • 96 Views

5 respostas

  • Voted
  1. Best Answer
    user10489
    2025-02-15T13:27:33+08:002025-02-15T13:27:33+08:00

    Isso não funciona porque os canos não funcionam dessa maneira.

    O comando df |(head -n1; grep shm)faz isso:

    • df gera alguma saída
    • head pega toda a saída, imprime a primeira linha e então desiste de jogar fora todo o resto do que leu.
    • Não há mais saída para o grep tomar como entrada.

    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:

    $ yes this is some long text | head -2000 | (head -1 ; wc -l)
    this is some long text
    1644
    

    Isso funciona da seguinte maneira:

    • O comando yes produz a mesma linha de texto repetidamente
    • O primeiro comando head trunca a saída yes para 2000 linhas
    • O cabeçalho em () lê um buffer cheio de texto e imprime a primeira linha
    • O comando wc conta as linhas restantes. Como você deve ter notado, o comando wc obteve significativamente menos de 1999 linhas.

    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.

    • 3
  2. Gilles Quénot
    2025-02-15T13:38:59+08:002025-02-15T13:38:59+08:00

    Para a parte do porquê , @user10489 deu uma resposta .

    Usando awk:

     df | awk 'NR==1;/shm/'
    

    NR==1é como head -n1e /shm/é comogrep shm

    • 3
  3. Paul_Pedant
    2025-02-15T18:33:26+08:002025-02-15T18:33:26+08:00

    Se awkler toda a entrada, ele não encontra o problema de buffering. Ele pode, portanto, seletivamente canalizar tudo depois do cabeçalho para sortvia awkpipe.

    df | awk 'NR == 1 { print; next; } /^.dev/ { print | "sort"; }'
    

    Não tenho muito shm, mas gosto de relatar minhas partições em sequência, assim como psa saída.

    Prolixo, mas talvez valha a pena declarar como uma função em .bashrc.

    Na verdade, bashele lê linhas sem buffer, então algo assim também funciona:

    df | { read -r Hdr; printf '%s\n' "$Hdr"; grep '^.dev' | sort; }
    
    • 2
  4. waltinator
    2025-02-15T12:56:15+08:002025-02-15T12:56:15+08:00

    Usando grepexpressões regulares de , pode-se:

    df | grep -E 'shm|1K-blocks`
    

    que corresponde a linhas que contêm ' shm' OU ' 1K-blocks'

    • 1
  5. showkey
    2025-02-15T16:47:38+08:002025-02-15T16:47:38+08:00

    1. { head -2; sort -n; } <raw.txtpode funcionar, aqui está o motivo: redirecionamento e pipe .

    2.Por que ps aux |(head -n 1 ;grep [f]irefox)pode funcionar?
    Buffer importa.

    yes this is some long text | head -355 | (head -1 ; wc -l)
    this is some long text
    0
    yes this is some long text | head -356 | (head -1 ; wc -l)
    this is some long text
    0
    yes this is some long text | head -357 | (head -1 ; wc -l)
    this is some long text
    1
    yes this is some long text | head -358 | (head -1 ; wc -l)
    this is some long text
    2
    

    user10489A 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 a ps auxsaída de muitas linhas preenche muitas páginas, head -n 1lê 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 para grepcorresponder.
    Conte o tamanho em uma página:

    yes this is some long text | head -357 | (head -1 ; wc -c)
    this is some long text
    19
    

    Uma linha aqui contém 23 caracteres:

    yes this is some long text | head -1|wc -c
    23
    

    Então:

    356*23+(23-19)=8192
    

    3. Escreva o título e adicione a linha correspondente.

    df | head -1 ;(df | grep shm)
    Filesystem     1K-blocks      Used Available Use% Mounted on
    tmpfs            4024488     99660   3924828   3% /dev/shm
    
    • -1

relate perguntas

  • exportar variáveis ​​​​env programaticamente, via stdout do comando [duplicado]

  • Problema estranho ao passar variáveis ​​do arquivo de texto

  • Enquanto a linha lê mantendo os espaços de escape?

  • ordem de substituição de processos `te` e `bash`

  • Execute um script muito lento até que seja bem-sucedido

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve