Convertendo GB em TB no script

3

Deve ser assim 0.972 / 3 = 0.324 é o valor real aqui. Portanto, se o valor de HDD Used estiver em G , deve ser calculado em TB e, em seguida, fazer a divisão.

# isi storagepool list -v |
awk '
    /Requested Protection:/ { parity=substr($NF,length($NF)-1,1) }
    /Nodes:/ { nodes=$NF }
    /HDD Total/ { hdd_total=$NF }
    /HDD Used/ { hdd_used=$NF }
    END {
        multiplier=nodes-parity
        total=hdd_total/nodes*multiplier
        used=hdd_used/nodes
        print "parity =" parity
        print "NodeNumber =" nodes
        print "Total =" total "TB"
        print "Effective Total volume = " total*0.8 " TB"
        print "USED =" used "%"
        print "Effective used=" used*multiplier*0.8 " TB"
        print "Available volume=" (hdd_total-hdd_used)/nodes*multiplier*0.8 " TB" }'
parity =1
NodeNumber =3
Total =37.3013TB
Effective Total volume = 29.8411 TB
USED =324.307%
Effective used=518.891 TB
Available volume=-489.05 TB

A produção real de HDD Used no comando isi storagepool list --v é G como mencionado abaixo e precisamos do cálculo em TB

# isi storagepool list -v
                Name: s210_21tb_800gb-ssd_128gb
               Nodes: 1, 2, 3
Requested Protection: +2d:1n
                Type: nodepool
            Children: -
               Usage
                HDD Used: 972.905G
               HDD Total: 55.9520T
              HDD % Used: 1.70%
                SSD Used: 0b
               SSD Total: 0b
              SSD % Used: 0.00%

# cat isi.py
isi storagepool list -v |
awk '
    /Requested Protection:/ { parity=substr($NF,length($NF)-1,1) }
    /Nodes:/ { nodes=$NF }
    /HDD Total/ { hdd_total=$NF }
    /HDD Used/ { hdd_used=num2gb($NF) }
    END {
        multiplier=nodes-parity
        total=hdd_total/nodes*multiplier
        used=hdd_used/nodes
        print "parity =" parity
        print "NodeNumber =" nodes
        print "Total = " total " TB"
        print "Effective Total volume = " total*0.8 " TB"
        print "USED =" used "%"
        print "Effective used=" used*multiplier*0.8 " TB"
        print "Available volume=" (hdd_total-hdd_used)/nodes*multiplier*0.8 " TB" }'

Editar 1 @ilkkachu Answer

# cat isi.py
#!/usr/bin/awk -f
isi storagepool list -v | awk 'function num2gb(n) { if (n ~ /T$/) return n * 1; return n*1024; }
    /Requested Protection:/ { parity=substr($NF,length($NF)-1,1) }
    /Nodes:/ { nodes=$NF }
    /HDD Total/ { hdd_total=$NF }
    /HDD Used/ { hdd_used=num2gb($NF) }
    END {
        multiplier=nodes-parity
        total=hdd_total/nodes*multiplier
        used=hdd_used/nodes
        print "parity =" parity
        print "NodeNumber =" nodes
        print "Total = " total " TB"
        print "Effective Total volume = " total*0.8 " TB"
        print "USED =" used "%"
        print "Effective used=" used*multiplier*0.8 " TB"
        print "Available volume=" (hdd_total-hdd_used)/nodes*multiplier*0.8 " TB" }'

Resultado

cat storageinfo_example_info
parity =1
NodeNumber =3
Total = 37.3013 TB
Effective Total volume = 29.8411 TB
USED =333925%
Effective used=534281 TB
Available volume=-534251 TB
    
por Shanker 05.05.2017 / 06:25

1 resposta

5

Se a entrada estiver algumas vezes em GB, algumas vezes em TB, eu escreveria uma função para lidar com ambos os casos ( funciona no manual do GNU awk ):

#!/usr/bin/awk -f
function num2gb(n) { 
    if (n ~ /T$/) return n * 1024;    # if TB, scale
    return n * 1;                     # else assume GB. * 1 converts to number
}  
{ printf "%.2f G\n", num2gb($1) }     # print, as an example

Em seguida, você pode usar a função ao ler os números da entrada para obter os números em GB:

/HDD Total/ { hdd_total = num2gb($NF) }
/HDD Used/ { hdd_used = num2gb($NF) }

Adicione casos para MB e PB , se necessário, e verifique se o programa que produz sua entrada pensa em poderes de 1024 ou potências de 1000 .

Ao produzir, você pode escolher o multiplicador como quiser.

O texto acima seria um script awk independente, na linha de comando você faria algo como

$ somecmd | awk 'function num2gb(n) { if (n ~ /T$/) return n * 1024; return n*1; }  
   /some pattern/ { some action }
   /other pattern/ { something with num2gb($n) ... } '
    
por 05.05.2017 / 09:49

Tags