Grep AND


 
Thread Tools Search this Thread
Top Forums UNIX for Dummies Questions & Answers Grep AND
# 1  
Old 04-09-2010
Grep AND

Hello all,

I have many files in a directory and I'm trying to read each file in the directory, search for four patterns and return the name of the file only if it contains each of the 4 patterns. I'm familiar with using egrep -l "(pattern1|pattern2)" *, but it seems like doing something similar by using an AND isn't so easy. Does anyone have a good idea on how to accomplish this?

So for example:
Dir: /home
file1
file2
file3
file4
filexx

Contents of each file:
config router id x.x.x.x
interface passive x.x.x.x
x.x.x.x 255.255.255.255 area

pattern1 = config router id x.x.x.x
pattern2 = interface passive x.x.x.x
pattern3 = x.x.x.x 255.255.255.255 area

I want to grep each file in the home dir for (pattern1 & pattern2 & pattern3) and return the name of the file with the info.

I hope this makes sense.
# 2  
Old 04-09-2010
Give a more precise example of the patterns and the desired output.
And please use code tags.
# 3  
Old 04-09-2010
I gave the patterns I would like to search for:

pattern1 = "config router id x.x.x.x"
pattern2 = "interface passive x.x.x.x"
pattern3 = "x.x.x.x 255.255.255.255 area"

The desired output is:
filename1
filename2

...maybe file3 or filename3 doesn't contain each of the three specified patterns so it wasn't returned in my example. I didn't use code tags because I haven't provided any code. Everything has been pseudo so far.
# 4  
Old 04-09-2010
grep can't do logical operations between multiple different patterns. You'll either need to run grep four times, or write a script to do the matching more efficiently. Does your system have BASH?

Code:
#!/bin/bash
STRINGS=( "config router id x.x.x.x"
                "interface passive x.x.x.x"
                "x.x.x.x 255.255.255.255 area" )

while [ ! -z "$1" ]
do
        MATCH=()


        while IFS="" read LINE
        do
                for ((N=0; N<${#STRINGS[@]}; N++))
                do
                        [ -z "${MATCH[$N]}" ] || continue
                        [[ "$LINE" =~ ${STRINGS[$N]} ]] && MATCH[$N]=1
                done
        done < "$1"

        TOTAL=0
        for ((N=0; N<${#STRINGS[@]}; N++))
        do
                [ -z "${MATCH[$N]}" ] || TOTAL=$((TOTAL+1))
        done

        [ "$TOTAL" -eq "${#STRINGS[@]}" ] && echo "$1"
        shift
done

You can run this like ./script file1 file2 file3 file4 and it'll print the names of the files that match all the patterns listed in STRINGS. Note these patterns are full-out regular expressions. May not be the fastest horse in the west but probably faster than running grep four separate times.
# 5  
Old 04-09-2010
An approach with awk:
Code:
awk '
!f{f=FILENAME}
$0 ~ p1 {a++}
$0 ~ p2 {b++}
$0 ~ p3 {c++}
FILENAME != f {
  if( a && b && c ) {print f}
  f=FILENAME
  a=b=c=0
}
END{if( a && b && c ) {print f}}
' p1="config router id x.x.x.x" p2="interface passive x.x.x.x" p3="x.x.x.x 255.255.255.255 area" file*


Last edited by Franklin52; 04-10-2010 at 09:48 AM.. Reason: adding END block
 
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Inconsistent `ps -eaf -o args | grep -i sfs_pcard_load_file.ksh | grep -v grep | wc -l`

i have this line of code that looks for the same file if it is currently running and returns the count. `ps -eaf -o args | grep -i sfs_pcard_load_file.ksh | grep -v grep | wc -l` basically it is assigned to a variable ISRUNNING=`ps -eaf -o args | grep -i sfs_pcard_load_file.ksh |... (6 Replies)
Discussion started by: wtolentino
6 Replies

2. UNIX for Dummies Questions & Answers

Piping grep into awk, read the next line using grep

Hi, I have a number of files containing the information below. """"" Fundallinfo 6.3950 14.9715 14.0482 """"" I would like to grep for Fundallinfo and use it to read the next line? I ideally would like to read the three numbers that follow in the next line and... (2 Replies)
Discussion started by: Paul Moghadam
2 Replies

3. UNIX for Dummies Questions & Answers

Bash - CLI - grep - Passing result to grep through pipe

Hello. I want to get all modules which are loaded and which name are exactly 2 characters long and not more than 2 characters and begin with "nv" lsmod | (e)grep '^nv???????????? I want to get all modules which are loaded and which name begin with "nv" and are 2 to 7 characters long ... (1 Reply)
Discussion started by: jcdole
1 Replies

4. Shell Programming and Scripting

AWK/GREP: grep only lines starting with integer

I have an input file 12.4 1.72849432773174e+01 -7.74784188610632e+01 12.5 9.59432114416327e-01 -7.87018212757537e+01 15.6 5.20139995965960e-01 -5.61612429666624e+01 29.3 3.76696387248366e+00 -7.42896194101892e+01 32.1 1.86899877018077e+01 -7.56508762501408e+01 35 6.98857157014640e+00... (2 Replies)
Discussion started by: chrisjorg
2 Replies

5. UNIX for Dummies Questions & Answers

Advanced grep'in... grep for data next to static element.

I have a directory I need to grep which consists of numbered sub directories. The sub directory names change daily. A file resides in this main directory that shows which sub directories are FULL backups or INCREMENTAL backups. My goal is to grep the directory for the word "full" and then... (2 Replies)
Discussion started by: SysAdm2
2 Replies

6. UNIX for Dummies Questions & Answers

Difference between grep, egrep & grep -i

Hi All, Please i need to know the difference between grep, egrep & grep -i when used to serach through a file. My platform is SunOS 5.9 & i'm using the korn shell. Regards, - divroro12 - (2 Replies)
Discussion started by: divroro12
2 Replies

7. Shell Programming and Scripting

grep for certain files using a file as input to grep and then move

Hi All, I need to grep few files which has words like the below in the file name , which i want to put it in a file and and grep for the files which contain these names and move it to a new directory , full file name -C20091210.1000-20091210.1100_SMGBSC3:1000... (2 Replies)
Discussion started by: anita07
2 Replies

8. UNIX for Dummies Questions & Answers

| help | unix | grep (GNU grep) 2.5.1 | advanced regex syntax

Hello, I'm working on unix with grep (GNU grep) 2.5.1. I'm going through some of the newer regex syntax using Regular Expression Reference - Advanced Syntax a guide. ls -aLl /bin | grep "\(x\)" Which works, just highlights 'x' where ever, when ever. I'm trying to to get (?:) to work but... (4 Replies)
Discussion started by: MykC
4 Replies

9. UNIX for Dummies Questions & Answers

| help | unix | grep - Can I use grep to return a string with exactly n matches?

Hello, I looking to use grep to return a string with exactly n matches. I'm building off this: ls -aLl /bin | grep '^.\{9\}x' | tr -s ' ' -rwxr-xr-x 1 root root 632816 Nov 25 2008 vi -rwxr-xr-x 1 root root 632816 Nov 25 2008 view -rwxr-xr-x 1 root root 16008 May 25 2008... (7 Replies)
Discussion started by: MykC
7 Replies

10. Shell Programming and Scripting

MEM=`ps v $PPID| grep -i db2 | grep -v grep| awk '{ if ( $7 ~ " " ) { print 0 } else

Hi Guys, I need to set the value of $7 to zero in case $7 is NULL. I've tried the below command but doesn't work. Any ideas. thanks guys. MEM=`ps v $PPID| grep -i db2 | grep -v grep| awk '{ if ( $7 ~ " " ) { print 0 } else { print $7}}' ` Harby. (4 Replies)
Discussion started by: hariza
4 Replies
Login or Register to Ask a Question