Dopasuj dokładny ciąg za pomocą grep

63

Mam plik tekstowy:

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

i chcę dokładnie dopasować deiauk. Kiedy to zrobię:

grep "deiauk" file.txt

Otrzymuję ten wynik:

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

ale potrzebuję tylko tego:

deiauk 1611516 afsdf 765
deiauk 1611516 afsdf ddfgfgd

Wiem, że istnieje -wopcja, ale wtedy mój sznur musi przeciąć całą linię.

użytkownik3334375
źródło
4
Czy rzeczywiście próbowałeś grep -w? (Ta opcja jest właśnie do tego celu i działa dla mnie.) - Uwaga: opcja -xpasuje do całej linii.
Janis
„Chcę dokładnie dopasowaćdeiauk / „ Potrzebuję tylko tego: deiauk 1611516 afsdf 765 - którego potrzebujesz?
Alex

Odpowiedzi:

127

Wypróbuj jedną z:

grep -w "deiauk" textfile

grep "\<deiauk\>" textfile
Janis
źródło
3
Jeśli masz kreskę ( - ) na końcu łańcucha, skrypt przyniesie go w wyniku, czego nie oczekiwano.
Evis,
Prawidłowy @Evert: słowa zawierają tylko znaki alfabetu, cyfry i znaki podkreślenia, więc jeśli masz skróty lub inne znaki dzielone, to nie działa.
ingyhere
@ Cyrus Nauczyłem się drugiego, używając *komendy vi / vim do słów.
shuva
Nie działa z żadną postacią specjalną, na którą ma org.apache.avro avroochotę org.apache.avro avro+mapred( na przykład *)
Vishrant
12

Wypróbuj to z GNU grepi zaznacz granice słów \b:

grep "\bdeiauk\b" file

Wynik:

deiauk 1611516 afsdf 765

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

Cyrus
źródło
Dzięki, ale dlaczego to dla mnie nie działa? echo "Enter login: " $vard grep -E "$\bvard\b" file.txt
user3334375
Spróbujgrep "\b${vard}\b" file.txt
Cyrus
1
wciąż nie działa: /
user3334375
Będziesz potrzebować read:read -p "Enter login: " vard; grep "\b${vard}\b" file.txt
Cyrus
7

Jeśli Twoje grepwsparcie -P(PCRE), możesz:

$ grep -P '(^|\s)\Kdeiauk(?=\s|$)' file.txt 
deiauk 1611516 afsdf 765
deiauk 1611516 afsdf ddfgfgd
heemayl
źródło
4
To jedyna odpowiedź, która działa z łączonymi wyrazami.
ingyhere
5

W zależności od rzeczywistych danych możesz poszukać słowa, po którym następuje spacja:

grep 'deiauk ' file.txt 

Jeśli wiesz, że musi to być na początku linii, sprawdź, czy:

grep '^deiauk ' file.txt 
Volker Siegel
źródło
Niestety, wszystkie inne odpowiedzi są nieprawidłowe.
Shatu
@Shatu Thanks! Zobaczmy więc, ile czasu zajmuje „bąbelkowanie na szczyt” ... Jestem ciekawy, ponieważ lubię dodawać odpowiedzi na stare pytania ... Myślę, że tak jest, ale wątpię. Byłoby dla mnie po prostu miłe, ale w rzeczywistości przydatne dla czytelników. Aby uczynić z tego dobry przykład, czy mógłbym poprosić cię o napisanie komentarza podsumowującego brak innych odpowiedzi?
Volker Siegel
(1) Gratulujemy osiągnięcia 10 000 powtórzeń. Masz teraz przywilej, aby zobaczyć, że ta odpowiedź została podana wcześniej i została usunięta. (2) Zawsze lepiej jest odpowiedzieć na pytanie tak szeroko, jak to możliwe, w oparciu o to, co zostało powiedziane, i nie dawać odpowiedzi, która działa tylko na przykładowe dane. Z przykładowych danych w pytaniu wynika, że ​​kolumny są oddzielone spacjami - ale nie jest to określone. Wszystkie pozostałe odpowiedzi będą działać również w przypadku kolumn oddzielonych tabulatorami. (3) Uniknąłeś fatalnej wady w odpowiedzi Tachomi (usuniętej), dodając ^- ale wszystkie pozostałe odpowiedzi działają… ( ciąg dalszy )
G-Man
(Ciąg dalszy)… jeśli ciąg pojawia się w polu innym niż pierwsze. (4) Ponadto wszystkie pozostałe odpowiedzi działają, jeśli „deiauk” jest ostatnim polem (tzn. Po nim nic nie ma).
G-Man,