55

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.

  • 4
    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 '15 at 21:53
  • "I want to match exactly deiauk / "I only need this: deiauk 1611516 afsdf 765" - which do you need? – alex Nov 16 '17 at 20:26
117

Try one of:

grep -w "deiauk" textfile

grep "\<deiauk\>" textfile
  • 3
    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 '16 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 '17 at 21:10
  • @Cyrus I learnt the second one while using vi/vim * command on words. – shuva Feb 13 '18 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 at 1:30
11

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

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

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

$ grep -P '(^|\s)\Kdeiauk(?=\s|$)' file.txt 
deiauk 1611516 afsdf 765
deiauk 1611516 afsdf ddfgfgd
  • 4
    This is the only answer that works with hyphenated words. – ingyhere Jan 31 '17 at 21:11
5

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 
  • Sadly, all of the answers other than this are incorrect. – Shatu Mar 14 '17 at 22:43
  • @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? – Volker Siegel Mar 14 '17 at 22:53
  • (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) – G-Man Jul 30 '18 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). – G-Man Jul 30 '18 at 19:57

protected by Archemar Jun 23 '17 at 8:42

Thank you for your interest in this question. Because it has attracted low-quality or spam answers that had to be removed, posting an answer now requires 10 reputation on this site (the association bonus does not count).

Would you like to answer one of these unanswered questions instead?

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