Збіжіть точний рядок за допомогою grep


63

У мене є текстовий файл:

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

і я хочу точно відповідати deiauk. Коли я це роблю:

grep "deiauk" file.txt

Я отримую такий результат:

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

але мені це потрібно лише:

deiauk 1611516 afsdf 765
deiauk 1611516 afsdf ddfgfgd

Я знаю, що є -wваріант, але тоді моя рядок повинна обробляти цілу лінію.


4
Ви насправді намагалися grep -w? (Цей варіант саме для цієї мети, і він працює для мене.) - Примітка: варіант -xвідповідає всій лінії.
Яніс

"Я хочу відповідати точноdeiauk / " Мені потрібно лише це: deiauk 1611516 afsdf 765" - що вам потрібно?
alex

Відповіді:


127

Спробуйте один із:

grep -w "deiauk" textfile

grep "\<deiauk\>" textfile

3
Якщо у вас є тире ( - ) в кінці рядка, цей скрипт принесе його в результаті, чого не очікували.
Евіс

Правильно @Evert: до слів входять лише літери, цифри та підкреслення, тому якщо у вас є абревіатури або інші дефіси, це не працює.
ingyhere

@Cyrus Я дізнався другий, використовуючи *команду vi / vim на словах.
shuva

Це не працює для будь-якого спеціального персонажа, який він, наприклад, org.apache.avro avroзіткнувся org.apache.avro avro+mapred(спробував *)
Vishrant

12

Спробуйте це за допомогою GNU grepта позначте межі слова за допомогою \b:

grep "\bdeiauk\b" file

Вихід:

deiauk 1611516 afsdf 765

Дивіться: http://www.regular-expressions.info/wordboundaries.html


Дякую, але чому це не працює для мене? echo "Enter login: " $vard grep -E "$\bvard\b" file.txt
користувач3334375

Спробуйтеgrep "\b${vard}\b" file.txt
Сайрус

1
все ще не працює: /
user3334375

Вам знадобиться read:read -p "Enter login: " vard; grep "\b${vard}\b" file.txt
Сайрус

7

Якщо ви grepпідтримуєте -P(PCRE), ви можете:

$ grep -P '(^|\s)\Kdeiauk(?=\s|$)' file.txt 
deiauk 1611516 afsdf 765
deiauk 1611516 afsdf ddfgfgd

4
Це єдина відповідь, яка працює з дефісами.
ingyhere

5

Залежно від реальних даних, ви можете шукати слово, за яким пробіл:

grep 'deiauk ' file.txt 

Якщо ви знаєте, що це має бути на початку рядка, перевірте його:

grep '^deiauk ' file.txt 

На жаль, всі відповіді, окрім цієї, невірні.
Шату

@Shatu Дякую! Тож давайте подивимося, скільки часу потрібно, щоб "піднятися до верху" ... Мені цікаво, тому що мені подобається додавати відповіді на старі запитання ... Я думаю, що це передбачається, що це так, але я сумніваюся в цьому. Це було б просто приємно для мене, але насправді корисно для читачів. Щоб зробити це добрим прикладом, я можу попросити вас написати коментар, у якому підсумовується те, чого відсутні інші відповіді?
Волкер Зігель

(1) Вітаємо з досягненням 10 кп. Тепер ви маєте право бачити, що ця відповідь була дана раніше та була видалена. (2) Завжди краще відповісти на питання якомога ширше, спираючись на сказане, а не давати відповідь, яка працює лише для вибіркових даних. З прикладу даних у питанні видно, що стовпці розділені пробілами, але це не вказано. Усі інші відповіді також працюватимуть для стовпців, розділених вкладками. (3) Ви уникнули фатальної вади у відповіді тахомі (видалено), додавши ^- але всі інші відповіді спрацьовують… (Продовжив)
G-Man

(Продовження)… якщо рядок з'являється в іншому полі, ніж перше. (4) Крім того, всі інші відповіді спрацьовують, якщо '' deiauk '' є останнім полем (тобто нічого після нього немає).
G-Man
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.