일련의 숫자를 요약하는 방법을 찾으려고 노력 중입니다.
다음 코드가 있습니다.
lshw -class disk -class storage | grep size: | cut -d "(" -f2 | cut -d ")" -f1
이것은 나에게 결과를 제공합니다
2TB
2TB
2TB
2TB
2TB
2TB
내 다른 컴퓨터에서:
500GB
1TB
1TB
이것을 요약할 수 있는 방법이 있나요? GB 또는 TB를 예약해야 합니다.
GB 단위로 표시할 수 있나요? 아니면 결과가 2개 이상인 경우 결과를 합산할 수 있나요? 이 명령을 실행해야 하는 컴퓨터가 여러 대 있습니다. 하드 드라이브가 5개 있는 경우도 있고 1개만 있는 경우도 있습니다.
답변1
xml
에서 제공하는 도구 나 출력 형식을 사용하여 json
사용 가능한 항목을 구문 분석하는 것이 더 쉬울 수 있습니다 .
lshw -quiet -class disk -class storage -xml |
xmlstarlet sel -t -v //size -n |
paste -sd + - |
bc |
numfmt --to=si --suffix=B
체재:
lshw -quiet -class disk -class storage -json |
jq '[.children[]|.size]|add' |
numfmt --to=si --suffix=B
xml
/ 구문 분석 도구가 없더라도 json
정확한 바이트 수를 얻을 수 있으므로 /에서 사람이 읽을 수 있는 형식으로 변환할 때 정보가 손실되지 않으므로 이러한 형식으로 출력하는 것이 여전히 더 나은 선택입니다.
그런 다음 기본 출력 형식과 같은 경험적 기반 구문 분석으로 되돌릴 수 있습니다. GNU 사용 grep
:
lshw -quiet -class disk -class storage -json |
grep -Po '"size" : \K\d+' |
paste -sd + - |
bc |
numfmt --to=si --suffix=B
--round=nearest
numfmt
반올림 대신 가장 가까운 숫자로 반올림하는 옵션을 GNU에 추가했습니다 (8.21(2013) 이후 GNU coreutils). 정확도를 높이려면 참조하세요 --format=%.3f
.
답변2
sed
+numfmt
해결책:
lshw -class disk -class storage \
| sed -n '/size:/ s/.*(\([0-9]*.*[KMGT]\)B)/\1/p' \
| numfmt --from si | paste -sd+ - | bc | numfmt --to si --suffix B
paste -sd+ - | bc
다음으로 대체할 수도 있습니다.awk '{ sum+=$1 }END{ print sum }'