我不知道如何在perl脚本中使用awk?

时间:2015-04-09 13:57:56

标签: perl

我的awk命令我喜欢这个

awk -F[][] '/Pattern.*.date/ {print $4}' $filename | xargs -0 -I {} grep {} $filename > /path/$filename

如何在perl脚本中使用它?
而且我还有多个文件来检查模式 请帮忙。

1 个答案:

答案 0 :(得分:1)

有一个名为a2p的程序将awk脚本转换为Perl脚本。这是方便的输出...

#!/usr/bin/perl
eval 'exec /usr/bin/perl -S $0 ${1+"$@"}'
    if $running_under_some_shell;
                        # this emulates #! processing on NIH machines.
                        # (remove #! line above if indigestible)

eval '$'.$1.'$2;' while $ARGV[0] =~ /^([A-Za-z_0-9]+=)(.*)/ && shift;
                        # process any FOO=bar switches

$FS = '\[';     # field separator from -F switch
$, = ' ';       # set output field separator
$\ = "\n";      # set output record separator

while (<>) {
    ($Fld1,$Fld2,$Fld3,$Fld4) = split(/[[\n]/, $_, -1);
    if (/Pattern.*.date/) {
        print $Fld4;
    }
}

我很难弄清楚你的awk脚本试图做什么:

awk -F[][] '/Pattern.*.date/ {print $4}' $filename

这表示要查找包含以下内容的所有行:

  • 该行中任意位置的Pattern一词。
  • 后跟零个或多个字符。
  • 后跟一个角色。
  • 后跟单词date

然后打印出每行的第4个字段。这是你想要的吗?通常,您可以使用/Pattern..*date/来表示类似的事情。

然后,你有-F[][][][]被假定为正则表达式,但[...]用于定义可以表示的一组字符(例如[012345]表示来自0的任何数字到5)。但是,在我的系统上,从-F'['上面的a2p结果看,它只会变为 | xargs -0 -I {} grep {} $filename > /path/$filename

现在,我们来:

-0

xargs表示传递给NUL文件名find字符分隔,而不是空格。这通常在执行find . -type f ... -print0 | xargs -0 ... 命令时使用:

xargs

这可以保证带有空格的文件名不会被awk包围。

除非字段#4(无论是什么)中嵌入了空字符,否则我不知道它是如何工作的。那么,这看起来像是在为同一个文件中的那些字段加油?

此外,当Perl功能更强大,速度更快时,您为什么要在Perl中调用grepgrep?事实上,如果您将awkgrep一起使用,通常可以删除awk并使用$filename

给我们举例说明{{1}}的样子以及您对该计划的期望。