cortar/grep e df -h

cortar/grep e df -h

Como posso fazer grep ou cortar o “173G” em “Verf”?

Eu preciso disso para scripts 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

Responder1

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

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

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

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

Também é simples sed, mas menos agradável se você precisar depurá-lo algumas montagens mais tarde:

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

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

Isso supõe GNU sed. A sintaxe compatível com POSIX inclui muitos escapes:

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

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

Responder2

Se você precisar usar grep e cut, poderá fazer 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 pelo qual @manatwork usou o awk. Você pode usar troutras ferramentas para torná-lo mais agradável e poder especificar o campo real que deseja cortar:

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

Alternativamente, o grep mais recente suporta a saída apenas de uma correspondência parcial e você pode usar isso em combinação com um truque do bash:

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

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

Responder3

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

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

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

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

Se você quiser usar apenas a parte numérica de"$av"( por exemplo123em 123G), você pode usarExpansão de parâmetrospara cortar a parte irrelevante assim:

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

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

Responder4

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 %so tamanho do bloco, assim %a * %scomo o espaço livre em bytes, e você pode fazer contas ao seu gosto para dividi-lo em uma unidade mais adequada de sua escolha, por exemplo:

echo $((`stat -f -c "%a*%s" /media/windows/`/1024/1024/1024))GiB

informação relacionada