-2

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;}  
4

3 に答える 3

1

フィールド区切り文字として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

于 2013-01-07T02:57:27.197 に答える
0

簡単な答えは、組み込みの型変換 (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) を使用する方がより堅牢です。

于 2013-01-07T15:51:40.287 に答える
0

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/'
于 2013-01-07T01:46:57.370 に答える