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 tr
outras 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 %s
o tamanho do bloco, assim %a * %s
como 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