Conversion de Go en TB dans le script

Il devrait être comme ceci 0.972 / 3 = 0.324 est la valeur réelle ici. Donc, si la valeur de HDD Used est dans G , il devrait être calculé en TB, puis faire la division.

 # 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 

Sortie réelle du HDD Used dans la command isi storagepool list --v est G comme mentionné ci-dessous et nous avons besoin du calcul en 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" }' 

Modifier 1 @ilkkachu Réponse

 # 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" }' 

Sortie

 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 

Si l'input est parfois en Go, parfois en TB, j'écrirais une fonction pour gérer les deux cas ( fonctions dans le manuel de 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 

Ensuite, vous pouvez utiliser la fonction lors de la lecture des numbers de l'input pour get les numbers en GB:

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

Ajoutez des cas pour MB et PB si nécessaire, et vérifiez si le programme produisant votre input pense avec des puissances de 1024 ou des puissances de 1000 .

Bien sûr, vous pouvez choisir le multiplicateur comme vous voulez.

Ce qui précède serait un script awk autonome, sur la command line, vous feriez quelque chose comme

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