0

トップ10の大きなファイルをgrepするためにunixで動作するこのコマンドがあります。ただし、Perl スクリプトでコマンドを使用すると問題が発生します。エラーはどこが間違っているかを示していますが、awkに慣れていないため、修正する方法がわかりません。Perl スクリプトでバックティックを使用できるように、コマンドを微調整する方法を教えてもらえますか?
トップ 10 ファイルを grep する Unix コマンド:-

find . -name .snapshot -prune -o -printf '%s %u %p\n' \
 | sort -nr \
 | head \
 | awk '{printf"%5.2f MB %s %s\n", $1/1024/1024, $2, $3}'

これは私がPerlで使用する方法ですが、エラーが表示されます:-

my $cmd = `find . -name .snapshot -prune -o -printf '\%s \%u \%p\n' | sort -nr | head | awk '{printf \%9.2f MB \%s \%s\n , \$1\/1024\/1024, \$2, \$3}'` ;

実行時に表示されるエラー:-

awk: cmd. line:1: {printf %9.2f MB %s %s
awk: cmd. line:1:         ^ parse error
awk: cmd. line:2:  , $1/1024/1024, $2, $3}
awk: cmd. line:2:  ^ parse error
awk: cmd. line:2:  , $1/1024/1024, $2, $3}
awk: cmd. line:2:                ^ parse error
awk: cmd. line:1: {printf %9.2f MB %s %s
awk: cmd. line:1:         ^ parse error
awk: cmd. line:2:  , $1/1024/1024, $2, $3}
awk: cmd. line:2:  ^ parse error
awk: cmd. line:2:  , $1/1024/1024, $2, $3}
awk: cmd. line:2:                ^ parse error
awk: cmd. line:1: {printf %9.2f MB %s %s
awk: cmd. line:1:         ^ parse error
awk: cmd. line:2:  , $1/1024/1024, $2, $3}
awk: cmd. line:2:  ^ parse error
awk: cmd. line:2:  , $1/1024/1024, $2, $3}
awk: cmd. line:2:                ^ parse error

Plsはいくつかのライトを当てます。ありがとう!

4

2 に答える 2

0

perl 内でソート ヘッド awk を使用したい理由がよくわかりませんが、ビールとしての自由なので、perl 内から awk を呼び出す例を次に示します :-)

my $cmd = qx(find . -name .snapshot -prune -o -printf '\%s \%u \%p\n' | sort -nr | head | awk '{printf("%9.2f MB %s %s \\n",(\$1/1024/1024) ,\$2,\$3);}' );
foreach my $line (split /[\r\n]+/, $cmd) {
 print $line;
}

awkビットは、このようなものによってperlで同等になります

while (<>) {
    ($Fld1,$Fld2,$Fld3) = split(' ', $_, -1);
    printf "%9.2f MB %s %s\n", ($Fld1 / 1024 / 1024), $Fld2, $Fld3;
}
于 2012-08-13T06:06:38.333 に答える
0

次のように、の最初の引数をprintf二重引用符で囲んでみてください: awk '{printf \"\%9.2f MB \%s \%s\n\", \$1\/1024\/1024, \$2, \$3}' (引用符もエスケープする必要があると思いますが、私は についてほとんど知識がないperlので、これを確認してください)。

いずれにせよ、必要な「ネイティブ」ツールがすべて perl にある場合は、シェルアウトするべきではありません。

于 2012-08-02T13:27:51.627 に答える