http://www.perlmonks.org?node_id=1064246


in reply to Match 2 strings in same line

The problem with your code is that you are not binding the second match to $line, so it implicitly binds to $_, which isn't what you want. The simplest change would be this:

push @eigrp, "$line\n" if $line =~ m/$logsIncDate/ && $line =~ m/SW_MATM-4-MACFLAP_NOTIF/;

Also, if you're just going to be appending a newline to your output, maybe (I don't know because I haven't seen the bigger picture) you could avoid that need by not chomping your input. And if your while loop is trivial, you could use implicit "$_":

while( <$fh> ) { push @eigrp, $_ if /$logsIncDate/ && /SW_MATM-4-MACFLAP-NOTIF/; }

Dave

Replies are listed 'Best First'.
Re^2: Match 2 strings in same line
by hmb104 (Sexton) on Nov 25, 2013 at 17:02 UTC

    Thanks for your reply Dave, but I have already tried all different ways of doing the match statement.

    The above statement should match this line (all txt below is one line), but it doesn't:

    Nov 25 10:59:13 10.1.162.11/10.1.162.11 1410: Nov 25 16:59:12.724: %SW +_MATM-4-MACFLAP_NOTIF: Host 30ff.0c00.d4be in vlan 162 is flapping be +tween port Fa0/13 and port Fa0/10
      What's in $logsIncDate? The most obvious case is that your string contains Metacharacters, and so they need to be escaped:
      if($line =~ m/\Q$logsIncDate\E/ and $line =~ m/SW_MATM-4-MACFLAP_NOTIF +/){ push(@eigrp, "$line\n"); }

      #11929 First ask yourself `How would I do this without a computer?' Then have the computer do it the same way.

        my $logsIncDate = `date +"%b %d %H"`; my @eigrp = (); open SwitchLogs, $logFile or die "Could not open $logFile: $!"; while (<SwitchLogs>) { chomp; my $line = $_; if($line =~ m/$logsIncDate/ && $line =~ m/SW_MATM-4-MACFLAP_NOTIF/ +){ push(@eigrp, "$line\n"); $sendemail = 1; } }

        All I want to do is to match the date/time in a line that contain the specified string. So the above code should catch the below one line:

        Nov 25 10:59:13 10.1.162.11/10.1.162.11 1410: Nov 25 16:59:12.724: %SW +_MATM-4-MACFLAP_NOTIF: Host 30ff.0c00.d4be in vlan 162 is flapping be +tween port Fa0/13 and port Fa0/10

      Yes, I was only able to answer based on the code you showed. The problem with the code you showed was the missing $line from the second regexp match. If there's still a problem after applying that change (which is still necessary), then you will have to move on to other issues, such as using \Q at the start of the first regexp.


      Dave