cut / grep e df -h

5

Como posso grep ou cortar o "173G" em "Verf"?

Eu preciso disso para o script Unix na escola.

jonas@jonaspc:~/$ df -h /dev/sda2
Dateisystem    Größe Benutzt Verf. Verw% Eingehängt auf
/dev/sda2       293G    121G  173G   42% /media/Windows
    
por jsterr 01.07.2012 / 15:20

4 respostas

7

A solução mais confortável para essa tarefa é awk :

df -h /dev/sda2 | awk 'NR==2{print$4}'

Ou, se mais partições estiverem listadas, você pode escolher a linha certa pelo ponto de montagem:

df -h | awk '$1=="/dev/sda2"{print$4}'

Também é simples com sed , mas é menos interessante se você precisar depurá-lo algumas montagens depois:

df -h /dev/sda2 | sed -rn '2s/^((\S+)\s+){4}.*//p'

df -h | sed -rn '/^\/dev\/sda2/s/^((\S+)\s+){4}.*//p'

Isso supõe o GNU sed . A sintaxe compatível com POSIX inclui muitos tipos de escape:

df -h /dev/sda2 | sed -n '2s/^\(\(\S\+\)\s\+\)\{4\}.*//p'

df -h | sed -n '/^\/dev\/sda2/s/^\(\(\S\+\)\s\+\)\{4\}.*//p'
    
por 01.07.2012 / 15:29
5

Se você precisar usar grep e cut, faça o seguinte:

df -h /dev/sda2 | grep sda | cut -d" " -f14

Mas isso é muito feio, já que você tem que contar os espaços (-f14) e o motivo @manatwork usado awk. Você poderia usar tr ou outras ferramentas para torná-lo mais agradável e ser capaz de especificar o campo real que deseja cortar:

df -h /dev/sda2 | grep sda | tr -s " " " " | cut -d" " -f4

Como alternativa, o grep mais recente suporta a saída apenas de uma correspondência parcial e você pode usá-la em combinação com um truque de bash:

df -h /dev/sda2 | grep -o '[^[:space:]]*G' | cut -d$'\n' -f3

O regex pode ser mais seguro, mas isso encontrará todos os campos de tamanho e os produzirá um por linha, enquanto o corte seleciona o segundo.

    
por 01.07.2012 / 16:20
2

Todas as outras respostas aqui são ótimas, mas se você usar Bash , não há necessidade de usar programas externos como awk, sed, grep, cut etc.

A linha a seguir fará o que você quiser:

{ read; read -r _ _ _ av _; } < <(df -h /dev/sda1)

"$ av" será o tamanho disponível em / dev / sda1

Se você quiser usar somente a parte numérica de "$ av" (por exemplo, 123 em 123G), você pode usar Expansão do parâmetro para aparar a parte irrelevante assim:

ir="${av##*[0-9]}"; echo "${av%$ir}"

ou apenas "${av%?}" se tiver certeza de que o sufixo "$ av" é apenas uma letra.

    
por 16.04.2013 / 23:08
0

Se não precisar ser grep / cut , você poderá obter as mesmas informações usando stat . No modo de sistema de arquivos, %a é o número de blocos livres e %s blocksize, então %a * %s é o espaço livre em bytes, e você pode fazer os cálculos de acordo com o seu gosto para dividi-los em uma unidade mais adequada. escolha, por exemplo:

echo $(('stat -f -c "%a*%s" /media/windows/'/1024/1024/1024))GiB
    
por 19.04.2013 / 04:03