Variável bash mantém ou mantém o valor / data

0

Em relação a este post: Soma dos números com KB / MB / GB / TB / PB ... sufixos

Eu tenho algumas máquinas que têm versões antigas do Debian nelas e não podem ser atualizadas para uma versão mais nova do Debian, o que significa que o pacote coreutils não contém numfmt . Eu tentei encontrar uma outra maneira de obtê-lo para ele (machine is Debian 7.6) , mas sou forçado a usar outra maneira de obter o tamanho do meu disco.

Atualmente estou usando o seguinte:

lshw -class disk -class storage | grep size: | cut -d "(" -f2 | cut -d ")" -f1 | sed -e 's/[^0-9]/ /g' | paste -sd+ | bc

Eu posso facilmente obter o tamanho, mas preciso também de GB / TB ou MB.

Se eu usar:

lshw -class disk -class storage | grep size: | cut -d "(" -f2 | cut -d ")" -f1

Eu obtenho

160GB 
160GB

Nas minhas outras máquinas eu pegaria um exemplo:

2TB
2TB
2TB

Existe uma maneira de salvar a palavra após os números em uma variável e depois imprimi-la?

Além disso, para eliminar a possibilidade de uma máquina ter várias unidades com tamanhos diferentes, como

500GB
2TB
3TB

Desta forma, meu comando infelizmente não funciona, ele lhe daria 505.

    
por TheSebM8 29.03.2018 / 08:34

1 resposta

1

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
}
    
por 29.03.2018 / 16:17