0

我有这个在 unix 中工作的命令来 grep 前 10 个大文件。但是,我在我的 Perl 脚本中使用该命令时遇到问题。虽然错误告诉我哪里出错了,但我不知道要修复它,因为我不熟悉 awk。谁能告诉我如何调整命令,以便我在 Perl 脚本中使用反引号?
用于 grep 前 10 个文件的 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

请点亮一些灯。谢谢!

4

2 回答 2

0

尝试printf用双引号将 for 的第一个参数括起来,如下所示:( awk '{printf \"\%9.2f MB \%s \%s\n\", \$1\/1024\/1024, \$2, \$3}' 我猜你也应该转义引号,但我几乎不知道perl,所以请检查一下)。

无论如何,如果您在 perl 中拥有所有必要的“本机”工具,那么您可能不应该掏腰包。

于 2012-08-02T13:27:51.627 回答
0

我真的不知道你为什么要在 perl 中使用 sort head 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 回答