我有一个文件,someFile
,如下所示:
$cat someFile
hdisk1 active
hdisk2 active
我使用这个shell脚本来检查:
$cat a.sh
#!/usr/bin/ksh
for d in 1 2
do
grep -q "hdisk$d" someFile && echo "$d : ok"
done
我正在尝试将其转换为Perl:
$cat b.sh
#!/usr/bin/ksh
export d
for d in 1 2
do
cat someFile | perl -lane 'BEGIN{$d=$ENV{'d'};} print "$d: OK" if /hdisk$d\s+/'
done
我导出外壳脚本中的变量d
,并使用Perl中的%ENV
获取该值。有没有更好的方法将这个值传递给Perl一行程序?
发布于 2014-02-11 16:50:15
对于这些一行程序来说,有时打破Perl封装层是一个很好的技巧:
for d in 1 2 ; do cat kk2 | perl -lne ' print "'"${d}"': OK" if /hdisk'"${d}"'\s+/';done
发布于 2010-07-24 04:03:49
在命令行上传递它,它将在@ARGV
中可用
for d in 1 2
do
perl -lne 'BEGIN {$d=shift} print "$d: OK" if /hdisk$d\s+/' $d someFile
done
请注意,此上下文中的shift
操作符删除了@ARGV
的第一个元素,在本例中为$d
。
发布于 2010-07-24 05:51:21
如果你在编写一行代码时遇到困难,可能对一行代码来说有点难(这只是我的观点)。我会同意@FM的建议,并用Perl完成所有的工作。读取整个文件,然后测试它:
use strict;
local $/ = '' ; # Read in the whole file
my $file = <> ;
for my $d ( 1 .. 2 )
{
print "$d: OK\n" if $file =~ /hdisk$d\s+/
}
你可以做循环,但那会更长。当然,这在一定程度上取决于文件的大小。
请注意,到目前为止,所有的Perl示例都将为每个匹配打印一条消息--您能确保没有重复的消息吗?
https://stackoverflow.com/questions/3321829
复制相似问题