【问题标题】:Passing a wildcard character within a variable to use with grep in Perl?在变量中传递通配符以在 Perl 中与 grep 一起使用?
【发布时间】:2014-10-06 14:54:22
【问题描述】:

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

我正在寻找以 ftp_log 开头的所有文件,所以在命令行上它会是:

grep ftpd ftp_log.* | sed 's/\*//g' > <searchfile>`

但似乎无法将其翻译为在 perl 中工作。

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

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

grep: /sysadm/shared/NCC/logs/sslmlvfp1/ftp_log.: 没有这样的文件或目录

谢谢。

【问题讨论】:

  • 你到底为什么要从 Perl 程序中掏出grepsed
  • 因为它可以完成工作。我还在学习语言...
  • 如果您使用 Perl (grep ftpd /sysadm/shared/NCC/logs/sslmvfp1/ftp_log.*) 输出的完整路径以交互方式运行 grep,是否可行?看起来您只是路径名错误。 (此外,您的输出消息与您的代码不匹配 - 它缺少 *。检查您的复制/粘贴。)
  • 我认为我遇到的问题是由于某种原因通配符 * 没有被发送,这正是我在屏幕上看到的方式,我没有遗漏任何副本/粘贴。

标签: perl grep wildcard


【解决方案1】:

我认为您只是路径名不匹配;您的代码看起来应该可以工作 - 尽管您不需要在 Perl 字符串中的 /s 前面放置反斜杠,并且您可以使用插值而不是串联:

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;

【讨论】:

  • 这看起来奏效了。谢谢你。我会把你所说的关于炮轰它的内容放在心上,并会尝试你提供的代码。再次感谢!
猜你喜欢
  • 2014-06-26
  • 2019-04-25
  • 2013-01-03
  • 1970-01-01
  • 2014-03-08
  • 2023-03-29
  • 2013-11-05
  • 2018-09-08
  • 2014-08-30
相关资源
最近更新 更多