如何调整以使我的命令在awk for printf中工作



我有这个命令,它在unix中可以用来grep前10个大文件。但是,我在Perl脚本中使用该命令时遇到了问题。虽然这个错误告诉我哪里出了问题,但我不知道该怎么解决,因为我不熟悉awk。有人能告诉我如何调整命令,以便我可以在Perl脚本中使用它吗
Unix命令grep top 10文件:-

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

这是我在Perl中的使用方式,但它显示了错误:-

my $cmd = `find . -name .snapshot -prune -o -printf '%s %u %pn' | sort -nr | head | awk '{printf %9.2f MB %s %sn , $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

请开灯。谢谢!

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

无论如何,如果您在perl中拥有所有必要的"本机"工具,那么您可能不应该花钱。

我真的不知道你为什么要在perl中使用排序头awk,然而,自由就像啤酒,所以这里有一个从perl中调用awk的例子:-)

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

awk位在perl中由类似的东西等效

while (<>) {
    ($Fld1,$Fld2,$Fld3) = split(' ', $_, -1);
    printf "%9.2f MB %s %sn", ($Fld1 / 1024 / 1024), $Fld2, $Fld3;
}

最新更新