118

I have a text file:

deiauk 1611516 afsdf 765
minkra 18415151 asdsf 4152
linkra sfsfdsfs sdfss 4555
deiauk1 sdfsfdsfs 1561 51
deiauk2 115151 5454 4
deiauk 1611516 afsdf ddfgfgd
luktol1 4545 4 9
luktol 1

and I want to match exactly deiauk. When I do this:

grep "deiauk" file.txt

I get this result:

deiauk 1611516 afsdf 765
deiauk1 sdfsfdsfs 1561 51
deiauk2 115151 5454 4

but I only need this:

deiauk 1611516 afsdf 765
deiauk 1611516 afsdf ddfgfgd

I know there's a -w option, but then my string has to mach whole line.

2
  • 9
    Have you actually tried grep -w? (That option is exactly for that purpose, and it works for me.) - Note: option -x matches the whole line.
    – Janis
    Jun 1, 2015 at 21:53
  • 1
    "I want to match exactly deiauk / "I only need this: deiauk 1611516 afsdf 765" - which do you need?
    – alex
    Nov 16, 2017 at 20:26

5 Answers 5

204

Try one of:

grep -w "deiauk" textfile

grep "\<deiauk\>" textfile
8
  • 6
    If you have a dash (-) at the end of the string this script will bring it as a result, which was not expected.
    – Evis
    Nov 11, 2016 at 14:28
  • Correct @Evert : Words include only alpha chars, digits and underscores, so if you have abbreviations or other items hyphenated, this does not work.
    – ingyhere
    Jan 31, 2017 at 21:10
  • @Cyrus I learnt the second one while using vi/vim * command on words.
    – KRoy
    Feb 13, 2018 at 19:35
  • It does not work for any special character it have for example org.apache.avro avro greped with org.apache.avro avro+mapred (tried with *)
    – Vishrant
    Mar 28, 2019 at 1:30
  • 4
    @Evis Use grep -w "deiauk$" textfile instead.
    – ceremcem
    Dec 28, 2020 at 22:41
23

Try this with GNU grep and mark word boundaries with \b:

grep "\bdeiauk\b" file

Output:

deiauk 1611516 afsdf 765

See: http://www.regular-expressions.info/wordboundaries.html

4
  • Thanks but why this is not working for me? echo "Enter login: " $vard grep -E "$\bvard\b" file.txt Jun 1, 2015 at 21:42
  • Try grep "\b${vard}\b" file.txt
    – Cyrus
    Jun 1, 2015 at 21:45
  • 2
    still doesn't work :/ Jun 1, 2015 at 21:50
  • You'll need read: read -p "Enter login: " vard; grep "\b${vard}\b" file.txt
    – Cyrus
    Jun 1, 2015 at 21:54
14

If your grep supports -P (PCRE), you can do:

$ grep -P '(^|\s)\Kdeiauk(?=\s|$)' file.txt 
deiauk 1611516 afsdf 765
deiauk 1611516 afsdf ddfgfgd
2
  • 8
    This is the only answer that works with hyphenated words.
    – ingyhere
    Jan 31, 2017 at 21:11
  • 1
    Why is \K (PCRE reset start of match) needed? This proposed solution seems to work just fine without it.
    – arielf
    Dec 23, 2019 at 21:53
7

Depending on your real data, you could look for the word followed by a space:

grep 'deiauk ' file.txt 

If you know it has to be at the start of the line, check for it:

grep '^deiauk ' file.txt 
5
  • Sadly, all of the answers other than this are incorrect.
    – Shatu
    Mar 14, 2017 at 22:43
  • 1
    @Shatu Thanks! So let's see how long it takes for it to "bubble up to the top"... I'm curious because I like to add answers to old questions... I think it is assumed it does, but I doubt it. It would be just nice for me, but actually useful for the readers. To make this a good example case, could I ask you to write a comment summarizing what the other answers are missing? Mar 14, 2017 at 22:53
  • 1
    (1) Congratulations on reaching 10K rep. You now have the privilege to see that this answer was given before, and was deleted. (2) It’s always better to answer the question as broadly as possible, based on what is said, and not give an answer that works just for the sample data. It appears, from the example data in the question, that the columns are separated by spaces — but that’s not specified. All the other answers will also work for tab-separated columns. (3) You avoided the fatal flaw in tachomi’s (deleted) answer by adding the ^ — but all the other answers work … (Cont’d) Jul 30, 2018 at 19:57
  • (Cont’d) …  if the string appears in a field other than the first one.  (4) Also, all the other answers work if ‘‘deiauk’’ is the last field (i.e., there’s nothing after it). Jul 30, 2018 at 19:57
  • This answer is not only correct but also readable. And probably the most portable across platforms.
    – Vorac
    Jul 22, 2021 at 3:33
2

I found -x worked for me.

Example
$ grep -inx -d skip 'favicon.ico' *
test.txt:1:favicon.ico
Grep Manual
-x, --line-regexp
              Select  only  those  matches  that  exactly  match the whole line.  For a regular expression pattern, this is like
              parenthesizing the pattern and then surrounding it with ^ and $.
2
  • For 1:1 matching the whole line which contains hyphens, -x the only option. For example grep -w "abc" <<<"abc-hac101-bb0" will match but grep -x "abc" <<<"abc-hac101-bb0" will not Nov 11, 2020 at 19:44
  • -1 grep -x searches for the entire line, so grep -x deiauk will not pick up the required line deiauk 1611516 afsdf 765 only grep -x 'deiauk 1611516 afsdf 765' will do that. The original question was "and I want to match exactly deiauk" which you have not done. Apr 28, 2021 at 12:21

Not the answer you're looking for? Browse other questions tagged or ask your own question.