Search Multiple Words / String Pattern Using grep Command

by on April 5, 2008 · 81 comments· LAST UPDATED August 10, 2012

in , ,

How do I search multiple strings or words using the grep command? For example I'd like to search word1, word2, word3 and so on within /path/to/file. How do I force grep to search multiple words?

The grep command supports regular expression pattern. To search multiple words, use following syntax:
grep 'word1\|word2\|word3' /path/to/file
In this example, search warning, error, and critical words in a text log file called /var/log/messages, enter:
$ grep 'warning\|error\|critical' /var/log/messages
To just match words, add -w swith:
$ grep -w 'warning\|error\|critical' /var/log/messages
egrep command can skip the above syntax and use the following syntax:
$ egrep -w 'warning|error|critical' /var/log/messages
I recommend that you pass the -i (ignore case) and --color option as follows:
$ egrep -wi --color 'warning|error|critical' /var/log/messages
Sample outputs:

Fig.01: Linux / Unix egrep Command Search Multiple Words Demo Output

Fig.01: Linux / Unix egrep Command Search Multiple Words Demo Output

TwitterFacebookGoogle+PDF versionFound an error/typo on this page? Help us!

{ 81 comments… read them below or add one }

1 Ayman Elkazzaz June 19, 2008 at 11:20 pm

you forget “\” so the command to search multiple string using grep as following
grep ‘warning\|error\|critical’ /var/log/messages

Reply

2 Matt January 18, 2012 at 10:44 am

Thank you for this. I couldn’t figure out why it wasn’t working.

Reply

3 David March 23, 2012 at 1:36 pm

And why did Vivek not correct this yet?

Please.

Reply

4 Aswin August 10, 2012 at 10:57 am

This is the first result in google. Please make this correction.

Reply

5 nixCraft August 10, 2012 at 11:15 am

The faq has been updated.

Appreciate all feedback.

Reply

6 khali February 28, 2014 at 2:59 pm

thanks. it helped

Reply

7 S. Mohana July 16, 2008 at 4:39 am

It is good explain for grep

but i want find out one particular string from another string. shall i use grep.

Reply

8 John September 17, 2008 at 2:37 pm

Thanks for the article. Is there a way to supply the words in a file? So in your example I could create a simple file containing:

warning
error
critical

I have over 200 words that I need to search – which is tiresome to put onto the command line.

Thanks,

Reply

9 nixCraft September 17, 2008 at 4:24 pm

Use the -f FILE option to obtain patterns from FILE, one per line:
grep -f words.txt /var/log/messages
words.txt

word1
word2
wordN

Reply

10 Hemal July 7, 2011 at 12:08 pm

Fantastic !! I had a scenario where in I had to pick up lines from a log file based on a word. Unfortunately I had 1000 such words and so it would have been difficult to find 1000 lines. But this solution really helped. Thanks.

Reply

11 Mats August 30, 2011 at 12:37 pm

Hi,

I have a requirement in which I would need to grep/find a line based on matching 3 different patterns. I know we can grep with -E multiple parameters seprated by pipe but this work Pipe (|) as OR condition. My requirement is I want to use AND condition. It should show line where it satisfy both the parameter.
e.g. line in a file as –
10-Aug-2010 Hello, this is a new example for unix.
I need to show this line only when my grep command matches all 3 words
this, new, unix How to right such grep command ?

Reply

12 pop richards August 30, 2011 at 12:56 pm

grep -n “$search1″ . | grep -n “$search2″ | grep -n “$search3″

after the first grep only statements “search1″ will come. this is filtered by the next grep creating and AND condition.

this is a round about solution coming out the top of my mind. if i find a better solution i’ll post it.

Reply

13 bharath May 7, 2012 at 10:48 am

this dint work for me:(

i used the cmd like grep -il SDI *.sql | grep -il Account *.sql | grep -il Customer *.sql
My requirement is as follows :

in the current folder, inside the files with extension .sql, i need to get the files hwich have SDI,Account and Costomer words in it.

Reply

14 pop richards May 7, 2012 at 1:09 pm

-l, –files-with-matches
Suppress normal output; instead print the name of each input file from which output would normally have been printed. The scanning
will stop on the first match.

did -l work for u??

Reply

15 pfaure February 4, 2009 at 2:38 am

How do you search for 2 strings on the same line?, but return the following line?

Reply

16 bambam August 16, 2012 at 2:07 am

grep ‘matching\|\(matching again\)’

Reply

17 Nauman Ali March 5, 2009 at 10:19 am

how do we search for two words and return it when both words are exists in the line. just like AND operator.

Reply

18 maginot September 9, 2009 at 1:55 pm

just pipe two greps grep ‘hello’ file.txt | grep ‘world’

Reply

19 relesh September 23, 2009 at 8:41 am

these all are not working

try

grep -E -e ‘warning|critical|error’ /var/log/messages in Linux
/usr/xpg4/bin/grep -E -e ‘warning|critical|error’ /var/adm/messages

Reply

20 relesh September 23, 2009 at 8:42 am

in solaris

Reply

21 sam August 22, 2013 at 11:46 am

It doesn’t work in Solaris. Do anyone have any commands to find multiple string (say string1 and string2) in a file and retunrs the line as well?

Thanks in advance.

Reply

22 Robert Guest September 25, 2009 at 5:39 pm

How do I only return lines that have both words in the line

grep -E “rob|bob” returns lines even if only one string is present.

Reply

23 Dr.Death October 13, 2010 at 10:57 am

try
echo “hi rob, where is bob?” | grep -E -o “rob|bob”

it should return:
rob
bob

Reply

24 anoop July 27, 2011 at 9:55 am

use
grep ‘rob’ | grep ‘bob’

Reply

25 bambam August 23, 2012 at 5:52 pm

Use awk.

$ echo “hi rob, where is bob” | awk '/rob/ && /bob/ {print $0}'

Reply

26 lpic.lt January 9, 2013 at 7:08 am

Thanks, awk saved my day ;) as i understand it’s not just awk it’s regexp too?!

so thanks again, the day was saved by the power puff girs… o0O0ops… awk and regexp!

:)

Reply

27 Robert Guest September 25, 2009 at 5:50 pm

I figured I should be more specific in my request.

I have the following line;

/usr/bin/dsmc archive -des=”DAILY” -archm=FS_DBARCH_DAILY “/brlog1/BIDW/redo/*”

I want a grep command to return the line number of this line

grep archive filename | grep -n redo doesn’t work because it returns the number of the line in the results from the first grep.

Reply

28 Sarat December 11, 2009 at 1:56 pm

Thanks a lot.This saved my time. We have a delivery tomorrow.

Reply

29 Sasikala January 15, 2010 at 7:18 am

@Nauman Ali,

To search for two words, and to return only if both words exist in a file, use this command

grep -Rl word1 *| xargs grep -l word2

Reply

30 johnny January 15, 2010 at 6:03 pm

Sasikala: THANK YOU!!!! That was very thoughtful of you to leave that for us, I needed it bad!!! :)

Reply

31 Nagendra Prasath January 30, 2010 at 1:03 pm

grep -Rl word1 *| xargs grep -l word2… how this work?

Reply

32 karatedog February 27, 2010 at 1:50 am

“grep -Rl word1 *| xargs grep -l word2… how this work?”

It just doesn’t work.
It will return the filename where exists at least one line where the two words are present. Which is no information at all.

Reply

33 karatedog February 27, 2010 at 1:58 am

@Robert Guest:
Attach the ‘-n’ parameter to the first grep, not to the second:

grep -n archive filename | grep redo

that way the second grep will get a line that contains the line number.

Reply

34 GUSTAVO COST June 2, 2010 at 2:51 am

Just try this one:

grep word1 | grep word2

Reply

35 GUSTAVO COSTA June 2, 2010 at 2:52 am

correction … :
grep word1 filename | grep word2

Reply

36 Anthony June 20, 2011 at 10:32 pm

That won’t work if you need to check if word 1 and word2 are anywhere in the file, because the first grep returns the matching line, so the second grep would only match if both words were on the same line.

Reply

37 MUAnis July 13, 2010 at 9:53 pm

How do you search for the string below in a file using grep ?

DeptId = ’123459′

Any help is appreciated.

Reply

38 Omprakash September 15, 2010 at 9:05 am

Hi,

I want to search multiple string using grep and want to display only matching string.

can any one pl guide me in this regards.
eg.
cat abc.txt |grep -e ‘ab’ -e ‘bc’ -e ‘cd’

If ‘bc’ is there in the file abc.txt then output should display only ‘bc’ rather than displaying the entire line.

Thanks & Regards,
Omprakash

Google for: grep multiple string and returning matching string

Reply

39 Ritika December 16, 2010 at 8:31 am

How to search multiple words in separate lines, inside a directory including sub-directory? Pls. give easy example.
I tried $grep -r “word1″ |grep -r “word2″ /Folder/subfolder/ > search.log

Reply

40 richardspop March 8, 2011 at 10:07 am

try
$grep -r “word1″ /Folder/subfolder/ | grep “word2″ > search.log

Reply

41 vaibhav March 20, 2011 at 9:28 am

hi

I have to grep exact line in file
for eg : file name test.txt includes
ram
5) 1,2,3
sohan
5) 6,7,8

so i want to grep ram and 5 so the output shud be
ram
1,2,3

should not be
ram
1,2,3
6,7,8

Reply

42 karatedog March 20, 2011 at 8:03 pm

First: grep is a single line utility. And because “5)” is on two lines, grep will find them, because it walks down the lines, and matches them to your rules, period.
Second: what grep finds, that ‘entire’ line will be displayed. So it is not possible to cut the “5)” from the beginning of the line, and display the rest.
If you want to find “ram” and after that the next “5)”, you need to use some utility that allows you to implement some logic. Like awk.
However if you can ensure that “5)…” will be after the found line – like “ram” – then you can use the ‘after context’ feature of grep, whic displayes the matching lines PLUS some line after that.

Reply

43 tsg April 19, 2012 at 10:56 am

use this :

grep ‘ram|5)’ test.txt | head -2 | tr -d ’5)’

Reply

44 kumar April 25, 2011 at 9:10 am

Hi,
I need to list the files which contains the 3 strings
<Tax
<Source
HEAD
These all 3 strings may be in different lines.

Thanks, Kumar

Reply

45 ajorpheus May 11, 2011 at 4:25 pm

@Kumar and others

To search for multiple strings in a file try doing this :

grep -il "String1" "PATH-OF-FILE" | xargs -I % grep -H "String2" % | xargs -I % grep -H "String3" %

For eg:
Let’s say I want to search for all those log4j.xml files which have the words CONSOLE and ASYNC in them .. then this is what I would do :

find "/cygdrive/e/MyDocs/Downloads/work/OATS Domain related/" -iname "log4j*.xml" | xargs -I % grep -ilr "CONSOLE" "%" | xargs -I % grep -H "ASYNC" %

Cheers!

Reply

46 nithya May 17, 2011 at 10:09 am

hi.
how to search a single line using grep command..
for example a file having 100 lines in that 100 line only one error line is there.

how do i retrive that single line using grep command.. i don’t know in which line in that error msg and like that error msg many of the lines in that file.. how do i find using ‘Grep’ command..

Reply

47 richardspop May 17, 2011 at 12:09 pm

do u have any keyword to identify the error message??
for eg. if the keyword is ‘error:’

then

grep -rn “error:*”

Reply

48 richardspop May 17, 2011 at 12:11 pm

its
grep -n “error:*” filename

since its one file -r is not necessary.

Reply

49 vinoth July 14, 2011 at 5:08 am

echo year, month, Quarter,productTOT, RegionTOT,Per_type,Data_type,Bucket_noTOT,Curr_dateTOT

from this output, i want only the string that has “TOT”

so the output,

productTOT, RegionTOT,Bucket_noTOT,Curr_dateTOT

could anybody please help me???

Reply

50 Vivek August 3, 2011 at 7:05 am

Thanks a lot ,it works fine

Reply

51 Saravanan August 23, 2011 at 4:43 am

hi, i want to grep the lines which has Eg:”uat” string in the but not “#” string in the line.. can anyone help me out in this????

Reply

52 Jass September 26, 2011 at 8:17 pm

/usr/xpg4/bin/grep -E ‘error|critical’ sample.txt

this works for me..

Reply

53 Abdulla October 19, 2011 at 7:22 pm

Could you please help me regarding while connect putty Linux based logs like collect grep is working

tail -f test_log | grep ‘\” 50[0234]‘ – working

tail -f test_log | grep ‘\” 50[0234]‘ | grep “404″ – not working

Any one help me on this regard? how to collect 1.500 to 504 2.404 alone.

Reply

54 Ramon December 8, 2011 at 9:10 pm

Great info site.
I have a need to search a file looking for dates and a string, For example:
(Dec 2 13:25:27 name local5:warn|warning vmdaemon[180412]: #415 Moved volume tape_1 #0055 (12345678) (abc123 from online to offline.). I need to search for a date and the “online to offline” string together. Also, with grep is it possible to do a date range in the search as oppose to a single date?

Reply

55 Om Prakash February 24, 2012 at 10:23 am

It is very good for the student and all type of reader.

Reply

56 Ben March 21, 2012 at 12:51 am

I also wanted to find all files that contained two separate words. The words could be anywhere in the file.

One way that I found to do this is:
grep -l word1 `grep -l word2 *`

The backtick quotes execute what is inside the quotes and replace it with the results. -l returns file names only.

More commonly I would also include -ir for case-ignorant recursive search:
grep -irl word1 `grep -irl word2 *`

Reply

57 Javier March 30, 2012 at 11:06 pm

Here’s an interesting one that I have been wracking my brain on…

I have some fairly large data files I need to search for certain conditions. Easy enough because I know the string I want to search for. However, the problem arises when someone duplicates the string in the field that I am searching for which expands the data criteria past my grep. here’s example:

String = “000/C///” Field delimiter is pipe so I use: grep -i “|000/C///|” to match the condition. Now what I have found some people doing is using multiple strings in that field where only one exists. Is there a way to search for multiples of the same string without having to do a ton of greps in a row?

Reply

58 jeff halper June 7, 2012 at 2:35 pm

Trying to do things with the -A -B options –

To display every line mentioning an astrological element:

grep “earth|air|fire|water” astro.log

How do I accomplish this new result with grep – I cannot figure out how to use the options -A and -B more than once within the same command.

earth and the 2 lines following
air – only the line containing air
fire and the 6 lines following
water and the 3 lines preceding

This would result in a 15-line capture if the command works.

Reply

59 ashok July 23, 2012 at 10:59 pm

TRY…!!

cat ASHOK.txt|grep -E word1|word2

is working for me… :)

Reply

60 sam July 31, 2012 at 10:18 pm

I am trying to pass the word/pattern from command line which I want to find in array but its not working. Say I want to find Jacob but its not returning anything.

#! usr/bin/perl
use Fcntl;
print "content-type: text/html \n\n";
print "Enter word : ";
$word = ;
@myNames = ('Jacob', 'Michael', 'Joshua', 'Matthew', 'Alexander', 'Andrew');
@grepNames = grep(/$word/, @myNames);
foreach $Names(@grepNames)
{
	print $Names;
	print "\n";
}

Reply

61 A1an August 2, 2012 at 12:08 pm

For me it works only if grep is set to use extended regular expressions with the -E flag

grep -E One\|Two\|”Thirty five”

Versions
GNU bash, version 4.1.2(1)-release (x86_64-koji-linux-gnu)
GNU grep 2.6.3

Reply

62 Tailgate August 3, 2012 at 3:19 pm

How do I used grep to fiind a vaue with a \\ contained within. For example. If I do a “cat /var/tmp/file | grep “NT Server\\Test” Nothing is returned.

Reply

63 bambam August 23, 2012 at 5:46 pm

Try:

cat /var/tmp/file | egrep  '[a-z]\\{2}[a-z]'

Reply

64 Ken Beesley October 26, 2012 at 6:03 pm

I have a file “nynorsk-utf-8.txt” in UTF-8 that is supposed to be in Nynorsk, one of the two official dialects of Norwegian. But it contains some “contamination” of Bokmal, the other official dialect. To try to identify the sections of Bokmal, I want to find all lines in nynorsk-utf-8.txt that contain any one of a set of 13 short words that are exclusive to Bokmal:

ikke|jeg|fra|en|et|de|mye|hun|noen|se|selv|særlig|uke

I’m on OS X, using egrep (GNU grep) 2.5.1
I’ve tried the following:

egrep -in “\” nynorsk-utf_8.txt > out.txt

using \ to enforce word boundaries. Yet the output contains lines that do not contain any of these 13 words (as stand-alone words). I also tried

egrep -inw ‘ikke|jeg|fra|en|et|de|mye|hun|noen|se|selv|særlig|uke’ nynorsk-utf_8.txt > outw.txt

with the exact same results. Then I tried listing the 13 words, one per line, in a separate file ‘wordlist’, and launched

grep -inw -f wordlist nynorsk-utf_8.txt > outf.txt

again with the same results. E.g. each output file contains line 16

16:– Dei fleste meiner at rota til den nye terrorismen er å finne i ein tilnærma samfunnsstrukturell stillstand – ein tilstand som pregar både dei rike og fattige arabiske landa.

that does not contain any of the 13 words (as a stand-alone word).

Can anyone tell me what I’m doing wrong? or is there, perchance, a big in (e)grep?

Reply

65 Kenneth Beesley October 29, 2012 at 4:53 pm

Sorry–I’m new to this list, and my first example got corrupted. Let me try to mark it up to display correctly

egrep -in “\<(ikke|jeg|fra|en|et|de|mye|hun|noen|se|selv|særlig|uke)\>” nynorsk-utf_8.txt > out.txt

i.e. I used \< and \> as explicit word boundaries. The results were equivalent to launching

egrep -inw “ikke|jeg|fra|en|et|de|mye|hun|noen|se|selv|særlig|uke” nynorsk-utf_8.txt > out.txt

Reply

66 Pradeep October 31, 2012 at 7:01 am

Hi im facing a prob in matching multiple patterns.

CODE:

Variable=”abc* def*” # two patterns abc* and def* are stored in variable.

I should use variable to find the matching lines. How can i achieve it.

We use -f option if patterns are in a file. How to use when patterns are in a variable???

Reply

67 Akbar November 10, 2012 at 3:21 pm

Hi All,

I have two text files
file one contains many words (single word per line) and file two contains many strings per line .
Now I want to Grep every line from file2 which contains file1 word.
Could any one help me out ?

This is like extracting from file2 matches from file1 !!

Very appreciated to the one who give solution here !

Reply

68 Akbar November 10, 2012 at 3:52 pm

I want the code to Grep the row from file2 containing file1 strings !!!

Eg :
1.file2.txt
Happy Diwali
All is well
One day
2.file1.txt
Happy
One

Now I want to Grep 1st and 3rd line from the file2.txt by file1.txt

Appreciated answer !

Reply

69 Akbar November 10, 2012 at 4:24 pm

!!!! Grep -f file1.txt file2.txt

Works guys , cheers ;))

Reply

70 Pramod December 20, 2012 at 10:21 pm

THanks nixCraft ,, it’s very useful

Reply

71 Vinay January 31, 2013 at 2:25 pm

Best answer would be to use the egrep command to get this worked:-
egrep ‘(str1|str2|str3)’

For example:-
bash-3.00$ cat triana
Man is the most beautiful creator of god.
Man is grate among all creators.
Awsome one…

Solution:-
bash-3.00$ egrep ‘(grate|god)’ triana

Man is the most beautiful creator of god.
Man is grate among all creators.

Reply

72 Shilp February 14, 2013 at 10:34 am

Hello,
I want to grep the pattern


but i think grep command is not reading newline. Please give me any solution if any one have.

Reply

73 sony March 29, 2013 at 8:31 am

FILENAME=’trade.tmp’

cat $FILENAME | while read line
do
#echo “$line”
Keyword=`cut -d “)” -f 2 $line| cut -d “(” -f 2`
Keyword_Count=`grep $KewKeyword $FILENAME`
echo “$Keyword_Count,$Keyword” > trade1.log

done

HI ,

In the above script i want to get the keyword and once i get the keyword I need to get the count of keyword.So i tried with the above script .it is showing the count first keyword only.Can anyone suggest me to resolve the problem.

Thanks In advance

Reply

74 abcd June 21, 2013 at 9:21 am

how do i search for a pattern /someword*/
here someword can be A-Z or a-z or 0-9
Any reply would be appreciated.

Reply

75 Pradeep June 21, 2013 at 10:02 am

grep “someword\*” filename
This will do your work!!

Reply

76 abcd June 21, 2013 at 10:39 am

Thanks for ur reply but I think i Did not tell my problem properly.

My qustion is :-

I need to search a pattern /someword*/ in a property file

here someword can be any thing eg.A-Z or a-z or 0-9
eg:-
/goingTo/FollowingPattern*/=Yes
/WhatASite/FloodsIn*/=No
/dummyData/FinallyHere*/=QT

here I have to search for patterns
/FollowingPattern*/
/FloodsIn*/
/FinallyHere*/

Hence someword is variable in property file.

Any help is appreciated

Reply

77 tigerwhat January 22, 2014 at 1:34 pm

Don’t this work?

$echo "/goingTo/FollowingPattern*/=Yes" | grep "/[a-zA-Z]*/F[a-zA-Z]*\*/[A-Z]"
/goingTo/FollowingPattern*/=Yes

Reply

78 tigerwhat January 22, 2014 at 1:41 pm

You said numbers too, so just put “[0-9]“

Reply

79 Huda September 4, 2013 at 3:07 pm

What really works is
grep -n “s1″ *.* |grep -n “s2″

Reply

80 mouli January 22, 2014 at 8:29 am

how to get separate out files for multiple patterns [stings]

Reply

81 tigerwhat January 22, 2014 at 1:25 pm

Iterate over for each.

Reply

Leave a Comment

Tagged as: , , , , , , ,

Previous Faq:

Next Faq: