首页 > 解决方案 > Perl 中的 grep 问题

问题描述

以下是来自 Perl 脚本..

$search2=  join(' ', $mo,$day,$hr); # Output "Aug 2 03"
$LOG1  = "/tmp/log"  # Log file path. It has $search2 inside it
$search1 = "issue|error"

这是我遇到问题的地方...

$failed = `"/bin/egrep" "$search1" "$LOG1"| grep "$search2"`;

没有grep "search2"低于输出

Aug  1 01:03:40 something sudo: pam_unix(sudo:auth): authentication failure; logname=something uid=0 euid=0 tty=/dev/pts/1 ruser= something=  user=something
Aug  1 03:34:20 something  sudo: pam_unix(sudo:auth): authentication failure; logname=something uid=0 euid=0 tty=/dev/pts/0 ruser= something=  user=something
Aug  2 00:43:29 something sudo: pam_unix(sudo:auth): authentication failure; logname=something uid=0 euid=0 tty=/dev/pts/1 ruser= something=  user=something
Aug  2 03:02:33 someting  sudo: pam_unix(sudo:auth): authentication failure; logname=something uid=0 euid=0 tty=/dev/pts/1 ruser= something=  user=something

但是使用时| grep "$search2"什么也得不到

   print "$failed"; # It is not throwing any output of 'Aug 2 03'

但是,当我在 Linux 命令行上执行相同的操作时,我得到了所需的输出。下面我在linux命令行上使用

/bin/egrep "issue|error" "/tmp/log" | grep  "Aug 2 03"

请帮助修复它。

标签: regexshellperl

解决方案


我认为你应该听从达达在评论中给出的建议。如果您发布的内容真的是您所看到的,则此方法行不通:

你建立你的字符串是这样的:

$search2=  join(' ', $mo,$day,$hr);

这意味着您在月和日之间有一个空格。此外,您复制了在不使用搜索字符串的情况下获得的输出,如下所示:

Aug  1 01:03:40 something sudo: pam_unix(sudo:auth): authentication failure; logname=something uid=0 euid=0 tty=/dev/pts/1 ruser= something=  user=something

这显然不是 8 月和 1 日之间的一个空格。

我很确定如果你/tmp/log用十六进制编辑器查看你的文件,你不会在“Aug”和“1”之间看到一个空格。

您还可以从命令行调用命令并将其通过管道传输到,例如,xxd以查看十六进制内容。


推荐阅读