Подберите точную строку, используя grep


65

У меня есть текстовый файл:

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

Ответы:


129

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

grep -w "deiauk" textfile

grep "\<deiauk\>" textfile

3
Если у вас есть тире ( - ) в конце строки, этот скрипт выведет его в результате, чего не ожидалось.
Evis

Правильно @Evert: слова включают только буквенные символы, цифры и подчеркивания, поэтому, если у вас есть сокращения или другие элементы, это не работает.
здесь

@ Cyrus Я узнал второй, используя *команду vi / vim для слов.
Шува

Он не работает для каких-либо специальных символов, например, с помощью org.apache.avro avrogreped 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
user3334375

Попробуйтеgrep "\b${vard}\b" file.txt
Cyrus

1
все еще не работает: /
user3334375

Вам понадобится read:read -p "Enter login: " vard; grep "\b${vard}\b" file.txt
Cyrus

7

Если ваша grepподдержка -P(PCRE), вы можете сделать:

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

4
Это единственный ответ, который работает с дефисными словами.
здесь

5

В зависимости от ваших реальных данных вы можете найти слово, за которым следует пробел:

grep 'deiauk ' file.txt 

Если вы знаете, что это должно быть в начале строки, проверьте это:

grep '^deiauk ' file.txt 

К сожалению, все ответы, кроме этого, являются неправильными.
Шату

@Shatu Спасибо! Итак, давайте посмотрим, сколько времени понадобится, чтобы он «всплыл на вершину» ... Мне любопытно, потому что я люблю добавлять ответы на старые вопросы ... Я думаю, что предполагается, что это так, но я сомневаюсь в этом. Это было бы просто приятно для меня, но на самом деле полезно для читателей. Чтобы это было хорошим примером, могу ли я попросить вас написать комментарий, в котором кратко изложены пропущенные ответы?
Фолькер Сигел

(1) Поздравляем с достижением 10K респ. Теперь у вас есть привилегия видеть, что этот ответ был дан ранее и был удален. (2) Всегда лучше ответить на вопрос как можно более широко, исходя из сказанного, а не дать ответ, который работает только для выборочных данных. Из данных примера в вопросе видно, что столбцы разделены пробелами, но это не указано. Все остальные ответы также будут работать для столбцов, разделенных табуляцией. (3) Вы избежали роковой ошибки в (удаленном) ответе тахоми, добавив ^- но все остальные ответы работают… (Продолжение)
G-Man говорит: «Восстановите Монику»

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