Eu não tenho o comando lshw
à mão, então falsifiquei alguns da seguinte forma:
size: 4200KiB (4200KB)
size: 420MiB (420MB)
size: 42GiB (42GB)
size: 4TiB (4TB)
size: 2PiB (2PB)
(Eu encontrei um exemplo on-line e simplesmente copiei as linhas "size:" e criei alguns tamanhos).
Eu usei o awk aqui porque quando você se encontra grep
ping e cut
ting e sed
ing, geralmente é mais fácil combinar toda a lógica em awk
.
O script awk abaixo define os separadores de campo ( FS
) como parênteses de abertura e fechamento, de modo que é mais natural extrair o valor desejado. Ele também (redundantemente) inicializa o tamanho total em execução (em Gb) para zero.
Cada vez que awk vê uma linha de entrada que combina com a expressão regular (simples) size:
, começa o trabalho real dentro das chaves. O valor dentro dos parênteses termina no campo # 2, então pedimos ao awk para combinar os dígitos naquele campo. Esperamos que eles comecem na posição 1, para algum número de caracteres. O valor é então extraído com base nesse comprimento e o sufixo é o restante da string.
Nós, então, lixamos a lista de possíveis sufixos (estenda conforme necessário) e multiplicamos o tamanho atual pela proporção apropriada (mencionada por Stéphane em um comentário sobre uma resposta atualmente excluída para ser unidades baseadas em 1000).
Após toda a entrada ter sido consumida, o awk imprime o tamanho total em GB.
Salve o script em um arquivo e execute-o como
lshw -class disk -class storage | awk -f /path/to/script
Script:
BEGIN {
FS="[()]"
sizegb=0
}
/size: / {
match($2, "[0-9]+")
value=substr($2, RSTART, RLENGTH)
suffix=substr($2, RLENGTH+1)
if (suffix == "KB")
sizegb += value / (1000*1000)
else if (suffix == "MB")
sizegb += value / 1000
else if (suffix == "GB")
sizegb += value
else if (suffix == "TB")
sizegb += value * 1000
else if (suffix == "PB")
sizegb += value * 1000 * 1000
}
END {
printf "Total size: %.2f GB\n", sizegb
}