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

时间:2012-08-02 12:57:15

标签: awk

我有这个命令可以在unix中使用grep来查找前10个大文件。但是,我在使用Perl脚本中的命令时遇到问题。虽然错误显示我出错的地方,但我不知道修复它,因为我不熟悉awk。任何人都可以告诉我如何调整命令,以便我使用它与Perl脚本中的反引号? Unix命令grep前10个文件: -

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

请点亮一些。谢谢!

2 个答案:

答案 0 :(得分:0)

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

无论如何,如果你在perl中拥有所有必需的“原生”工具,你可能不应该掏出来。

答案 1 :(得分: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;
}