Reputation: 11002
I am passing a list of regex patterns to grep
to check against a syslog file. They are usually matching an IP address and log entry;
grep "1\.2\.3\.4.*Has exploded" syslog.log
It's just a list of patterns like the "1\.2\.3\.4.*Has exploded"
part I am passing, in a loop, so I can't pass "-v", for example.
I am confused trying to do the inverse of the above, and not match lines with a certain IP address and error so "!1.2.3.4.*Has exploded" will match syslog lines for anything other than 1.2.3.4 telling me it has exploded. I must be able to include an IP address to not match.
I have seen various similar posts on Stack Overflow. However, they use regex patterns that I can't seem to get to work with grep
. What would be a working example for grep
?
This is happening in a script like this;
patterns[1]="1\.2\.3\.4.*Has exploded"
patterns[2]="5\.6\.7\.8.*Has died"
patterns[3]="\!9\.10\.11\.12.*Has exploded"
for i in {1..3}
do
grep "${patterns[$i]}" logfile.log
done
Upvotes: 321
Views: 467218
Reputation: 21
patterns[1]="1\.2\.3\.4.*Has exploded"
patterns[2]="5\.6\.7\.8.*Has died"
patterns[3]="\!9\.10\.11\.12.*Has exploded"
for i in {1..3}
do
grep "${patterns[$i]}" logfile.log
done
should be the the same as
egrep "(1\.2\.3\.4.*Has exploded|5\.6\.7\.8.*Has died)" logfile.log | egrep -v "9\.10\.11\.12.*Has exploded"
Upvotes: 2
Reputation: 5782
(?<!1\.2\.3\.4).*Has exploded
You need to run this with -P to have negative lookbehind (Perl regular expression), so the command is:
grep -P '(?<!1\.2\.3\.4).*Has exploded' test.log
Try this. It uses negative lookbehind to ignore the line if it is preceded by 1.2.3.4
.
Upvotes: 21
Reputation: 20270
grep
matches, grep -v
does the inverse. If you need to "match A but not B" you usually use pipes:
grep "${PATT}" file | grep -v "${NOTPATT}"
Upvotes: 585
Reputation: 977
It seems no one has posted a blend of the best of all answers, regex (-E
) with match inversion (-v
)
grep -Ev 'pattern1|pattern2|pattern3' file
Notably, no lookarounds required, so this works if your grep version doesn't have -P
available.
Upvotes: 18