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

関連情報