2014-10-06 54 views
0

我试图给变量分配一个带有通配符的文件路径,然后在grep命令中使用该变量。不幸的是,当我运行它时,没有看到通配符。我试图使用。*来代替,甚至作为一个正则表达式,但都没有奏效。任何帮助,将不胜感激。在变量中传递通配符与Perl中的grep一起使用?

我期待到grep与ftp_log开头的所有文件,因此,在命令行上这将是:

​​

似乎无法翻译它在Perl的工作,虽然。

$filename = "\/sysadm\/shared\/NCC\/logs\/" . $SYSTEM . "\/ftp_log.*"; 

`grep ftpd $filename | sed 's/\*//g' > $searchfile`; 

的grep:/ SYSADM /共享/ NCC /日志/ sslmlvfp1/ftp_log .:没有这样的文件或目录

感谢。

+3

为什么在世界上你会想要从Perl程序中掏出'grep'或'sed'? – 2014-10-06 14:55:34

+0

因为它完成了工作。我仍然在学习语言...... – cycloxr 2014-10-06 14:56:58

+0

如果您交互式地运行带有Perl输出的完整路径的'grep'('grep ftpd/sysadm/shared/NCC/logs/sslmvfp1/ftp_log。*'),这是否正常工作?看起来你只是有错误的路径名。 (另外,你的输出信息与你的代码不匹配 - 它缺少'*'。检查你的复制/粘贴。) – 2014-10-06 15:02:27

回答

2

我认为你只是有一个路径名不匹配;你的代码看起来像它应该工作 - 尽管你并不需要把反斜线在/ S前在一个Perl的字符串,并且可以使用插值而不是串联的:

my $filename = "/sysadm/shared/NCC/logs/$SYSTEM/ftp_log.*"; 

这就是说,它是一个有点傻从perl退出到grepsed。这里有一种方法可以在Perl程序本身内做同样的事情:

open my $out, '>', $searchfile; 
foreach my $filename (glob "/sysadm/shared/NCC/logs/$SYSTEM/ftp_log.*") { 
    open my $log, '<', $filename; 
    while (<$log>) { 
    if (/ftpd/) { 
     s/\*//g; 
     print $out $_; 
    } 
    } 
    close $log;  
} 
close $out; 
+0

这看起来工作。谢谢。我会采取你所说的关于将其解开的内容,并尝试你提供的代码。再次感谢! – cycloxr 2014-10-06 15:14:47