Bash変数は値/データを保存または保持します。

Bash変数は値/データを保存または保持します。

この記事について:KB/MB/GB/TB/PB... サフィックスを含む合計数

最新バージョンのDebianにアップグレードできない古いDebianバージョンを使用しているコンピュータがいくつかあります。これはパッケージが含まれていないことcoreutilsを意味しますnumfmt。パッケージを入手する別の方法を見つけようとしましたが、(machine is Debian 7.6)ディスクサイズを取得するために別の方法を使用する必要がありました。 。

現在、以下を使用しています。

lshw -class disk -class storage | grep size: | cut -d "(" -f2 | cut -d ")" -f1 | sed -e 's/[^0-9]/ /g' | paste -sd+ | bc

サイズは簡単に入手できますが、GB / TBまたはMB単位でサイズをインポートする必要があります。

私が使用している場合:

lshw -class disk -class storage | grep size: | cut -d "(" -f2 | cut -d ")" -f1

わかりました。

160GB 
160GB

他のコンピュータでは、次の例を見ることができます。

2TB
2TB
2TB

数字の後の単語を変数に保存して印刷する方法はありますか?

また、1つのシステムに異なるサイズの複数のドライブがある可能性を排除します。

500GB
2TB
3TB

残念ながら、この方法では私のコマンドは機能しません。505.

答え1

このコマンドがないので、いくつかのlshwコマンドを偽造しました。

   size: 4200KiB (4200KB)
   size: 420MiB (420MB)
   size: 42GiB (42GB)
   size: 4TiB (4TB)
   size: 2PiB (2PB)

(「size:」行をコピーしていくつかの寸法を設定した例をオンラインで見つけました。)

grepここでawkを使用する理由は、一度ping、cuttinging、ingを見つけたら、sedすべてのロジックをawk

以下のawkスクリプトは、FS必要な値をより自然に抽出するために、フィールド区切り文字()を左右の角括弧に設定します。また、(冗長)合計実行サイズ(GB)をゼロに初期化します。

awk は (単純な) 正規表現に一致する入力行を見るたびに中かっこ内size:で実際の操作を開始します。角かっこ内の値はフィールド#2で終わるため、awkにそのフィールドの数字と一致するように要求します。私たちは場所1から始めて、特定の数の文字を含めたいと思います。その後、その長さに基づいて値が抽出され、サフィックスは文字列の残りの部分です。

次に、可能なサフィックスのリストを見て(必要に応じて拡張)、現在のサイズに適切な割合を掛けます(Stéphane現在削除されている回答にコメントを残してください単位は1000に基づいています)。

すべての入力が消費された後、awkは合計サイズをGB単位で印刷します。

スクリプトをファイルに保存し、次のように実行します。

lshw -class disk -class storage | awk -f /path/to/script

スクリプト:

BEGIN {
  FS="[()]"
  sizegb=0
}

/size: / {
  match($2, "[0-9]+")
  value=substr($2, RSTART, RLENGTH)
  suffix=substr($2, RLENGTH+1)
  if (suffix == "KB")
    sizegb += value / (1000*1000)
  else if (suffix == "MB")
    sizegb += value / 1000
  else if (suffix == "GB")
    sizegb += value
  else if (suffix == "TB")
    sizegb += value * 1000
  else if (suffix == "PB")
    sizegb += value * 1000 * 1000
}

END {
  printf "Total size: %.2f GB\n", sizegb
}

関連情報