0.972
/
3
여기 = 0.324
실제 값 과 같아야 합니다 . 따라서 값 HDD Used
이G따라서 TB 단위로 계산한 후 나누어야 합니다.
# 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
HDD Used
명령의 실제 출력 isi storagepool list --v
은 G이며 아래에 언급된 대로 이를 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" }'
@ilkkachu 답변 1개 수정
# 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" }'
산출
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
답변1
입력이 때로는 GB 단위이고 때로는 TB 단위인 경우 두 경우를 모두 처리하는 함수를 작성합니다(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
그런 다음 이 함수를 사용하여 입력에서 숫자를 읽는 동안 GB 단위의 숫자를 가져올 수 있습니다.
/HDD Total/ { hdd_total = num2gb($NF) }
/HDD Used/ { hdd_used = num2gb($NF) }
필요한 경우 MB
및 에 대한 사례를 추가 PB
하고 입력을 생성한 프로그램이 의 거듭제곱 1024
을 고려하는지 확인합니다 1000
.
내보낼 때 물론 원하는 배수를 선택할 수 있습니다.
위의 내용은 독립 실행형 awk
스크립트이며 명령줄에서 다음과 같은 작업을 수행합니다.
$ somecmd | awk 'function num2gb(n) { if (n ~ /T$/) return n * 1024; return n*1; }
/some pattern/ { some action }
/other pattern/ { something with num2gb($n) ... } '