Como recupero apenas a linha necessária da saída do terminal?

16

Eu quero obter apenas digamos terceira linha de df -hsaída.

Que tipo de comando devo usar?

emrecnl
fonte
16
Nota para o futuro: esta questão é muito, muito básica. Normalmente, é recomendável mostrar certo esforço e o que você tentou antes de perguntar.
Sergiy Kolodyazhnyy
Embora possa ser legítimo obter a 3ª linha de um arquivo com um formato estático presumido, isso é diferente da 3ª linha de um programa de diagnóstico com uma saída que varia dependendo do estado do sistema. Por exemplo, montando uma nova unidade / partição em ordem alfabética antes de sua 3ª linha atual explodir. Assim, a resposta da @ Random832 abaixo é a melhor.
MarkHu

Respostas:

31

Isso produzirá a terceira linha, independentemente do conteúdo.

df -h | sed -n 3p
muru
fonte
+1 para menor resposta: df -h|sed -n 3p.
EKons
16

O dfcomando realmente aceita um argumento para identificar o sistema de arquivos que você deseja. Então você pode usar, por exemplo, df /homeou df /dev/sda3.

Se você pretende analisar a saída de um script, convém usá df -P-lo para garantir que ele nunca seja agrupado em várias linhas. Portanto, por exemplo, você poderia usar df -Ph /home | tail -n +2(mas se estiver analisando a saída de um script, esteja ciente da possibilidade de nomes de arquivos com espaços)

Random832
fonte
2
É isso aí! Em vez de analisar a saída, use o comando para fornecer exatamente o que você deseja.
Fedorqui
11
Mas o OP disse que queria a linha 3. df /homefornece um cabeçalho. Você está interpretando a finalidade do usuário. Tu podes estar certo. Você pode estar errado, quem sabe?
Mike S
@MikeS Uma dúzia de outras respostas já abordou a obtenção da linha 3 sem contexto. Forneci informações adicionais para que o OP o tenha, se for útil para ele. E tail -n +2remove o cabeçalho.
Random832
14

Você pode usar uma combinação de heade tail:

df -h | head -3 | tail -1

Ou

df -h | tail -n +3 | head -1

Mas observe que, dfpermite filtrar a saída a partir das opções em dfsi, você deve examiná-las primeiro antes de usar qualquer comando externo.

Verifique man df.

heemail
fonte
4
+1 para mencionar que df pode filtrar entradas específicas
Sergiy Kolodyazhnyy
2
De fato, quase sempre é melhor filtrar os dados antes de canalizar para programas externos.
Zach Mertes
10

O Awk é uma ferramenta de processamento de texto, portanto é apropriado para esta tarefa

df -h | awk 'NR == 3'
Sergiy Kolodyazhnyy
fonte
6

Presumo que você não esteja necessariamente procurando a terceira linha, mas a linha que menciona um disco específico (por exemplo /dev/sda3) ou um ponto de montagem específico (por exemplo /home).

Portanto, em vez de apenas exibir a terceira linha, que é insegura porque a ordem de saída pode mudar e você pode obter um resultado diferente, é possível filtrar a saída pelo conteúdo e mostrar apenas as linhas que correspondem a um padrão específico ou que contêm uma palavra-chave.

Sua ferramenta para isso é grep.

Por exemplo, se você quiser a linha sobre o dispositivo /dev/sda3, digite:

df -h | grep '/dev/sda3'

Se você deseja que a linha mencione seu diretório inicial como ponto de montagem, use:

df -h | grep '/home'
Byte Commander
fonte
3
Ou df -h /dev/sda3ou df -h /home(o último funciona mesmo que não seja um ponto de montagem).
Random832
6

Você também pode usar perl:

df -h | perl -ne 'print if $.==3' 

O $.é o número da linha atual, para que você possa imprimir a enésima linha com perl -ne 'print if $.==N'.

Terdon
fonte
11
É por isso que Perl ainda é relevante em minha opinião. Ele combina sed e awk com uma linguagem de programação estruturada que (embora muitos digam que é realmente muito feia [e eu possa concordar]) seja pelo menos consistente e muito útil para essas frases curtas. Obrigado, Terdon. Isso é quase tão sucinto quanto o exemplo sed, se um pouco mais detalhado.
Mike S
@ MikeS feliz em ajudar. Como hacker Perl, no entanto, devo salientar que o código Perl é tão feio quanto você. Bons programadores podem escrever códigos bonitos em Perl, mas o idioma não o força e é fácil não fazê-lo.
terdon
2

Minha primeira idéia seria uma construção de cabeça-cauda.

Exemplo:

df -h | head -3 | tail -1

head -3faz com que a saída pare após três linhas e produz tail -1somente a última linha.

Como alternativa, se você souber como será a saída, também poderá grepencontrar linhas que contenham uma determinada string.

Wayne_Yux
fonte