du -h コマンドから最初のフィールドの小数部分を取得したい。したがって、フィールド区切り文字は文字 K または文字 M にする必要があります。 -F で複数のオプションを試しましたが、機能しませんでした。
du -h AWSD.????.20121123.????.LBB4.????.*.gz |
tr -s ' ' |
awk -F'K|M' 'BEGIN{x=0;} {print $1;} END{print x;}
フィールド区切り文字としてK
またはを使用する awk ソリューションを探しているようです。あなたの解決策はほぼ正しかったので、文字クラスとしてM
囲むとうまくいきます:KM
du -h | awk -F '[KM]' '{ print $1 }'
さて、元の質問では、合計使用量も求めていました。その場合、K
またはM
文字を削除するのは正しくありません。この場合は、df -k
列 1 を使用して合計する方が適切です。
$ du -k | awk '{ sum+=$1 } END { print sum, "k" }'
52939620 k
$ du -k | awk '{ sum+=$1*1024 } END { print sum/1e6, "x 1e6 bytes" }'
54210.2 x 1e6 bytes
$ du -k | awk '{ sum+=$1*1024 } END { print sum/1e9, "x 1e9 bytes" }'
54.2102 x 1e9 bytes
このコードが、MebiBytes と MegaBytes に関する議論をどのように回避しているかに注意してください。
注 2: ただし、このコードは、親ディレクトリごとに子ディレクトリをもう一度カウントします。Solaris システムでは、これを防ぐため-o
に toを追加します。du -k
簡単な答えは、組み込みの型変換 (nawk/gawk) を使用することです。
du -h | nawk '{print $1+0}'
フィールドはゼロを追加することで数値型に変換され、数値の一部ではない末尾の文字は単純に無視されます。(ただし、数値として受け入れられるものを理解する必要があります。たとえば、「123e10」のような入力は 123x10^10 として扱われます。)
これに FS を使用することの欠点は、どのセパレーターが存在していたかを回復する唯一の方法が $0 を検査することであるということです。何かのようなもの:
if ( match($1,/([0-9.]+)([KMGT])/,bb) ) {
...
}
私の提案です(gawk> = 3.1.0)。
大きな数を扱う場合は、単に「印刷」するのではなく、printf() を使用するか、デフォルトの数値出力形式 (OFMT 変数) を変更する必要があります。私は長い間、ls/df/du などのプラットフォームに依存する出力の解析を断念してきました。私の経験では、GNU stat (coreutils) を使用する方がより堅牢です。
I think what you want is either the first field:
du -h AWSD.????.20121123.????.LBB4.????.*.gz | cut -f1
Or first field without the unit:
du -h AWSD.????.20121123.????.LBB4.????.*.gz | cut -f1 | sed 's/[GMK]$//'
Or to get the integer part of the first field:
du -h AWSD.????.20121123.????.LBB4.????.*.gz | sed 's/\([0-9]*\).*/\1/'