KB/MB/GB/TB/PB... 접미사가 포함된 합계 수

KB/MB/GB/TB/PB... 접미사가 포함된 합계 수

일련의 숫자를 요약하는 방법을 찾으려고 노력 중입니다.

다음 코드가 있습니다.

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=nearestnumfmt반올림 대신 가장 가까운 숫자로 반올림하는 옵션을 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 }'

관련 정보