我的awk命令我喜欢这个
awk -F[][] '/Pattern.*.date/ {print $4}' $filename | xargs -0 -I {} grep {} $filename > /path/$filename
如何在perl脚本中使用它?
而且我还有多个文件来检查模式
请帮忙。
答案 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中调用grep
和grep
?事实上,如果您将awk
与grep
一起使用,通常可以删除awk
并使用$filename
。
给我们举例说明{{1}}的样子以及您对该计划的期望。