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 ja chcesz dopasować dokładnie deiauk
. Kiedy to robię:
grep "deiauk" file.txt
Otrzymuję taki wynik:
deiauk 1611516 afsdf 765 deiauk1 sdfsfdsfs 1561 51 deiauk2 115151 5454 4
ale ja potrzebuję tylko tego:
deiauk 1611516 afsdf 765 deiauk 1611516 afsdf ddfgfgd
Wiem, że jest opcja „-w
, ale wtedy mój ciąg musi zostać wykonany w całości
Komentarze
Odpowiedź
Wypróbuj jedną z:
grep -w "deiauk" textfile grep "\<deiauk\>" textfile
Komentarze
- Jeśli masz myślnik ( – ) na końcu ciągu ten skrypt przyniesie wynik, czego nie oczekiwano.
- Popraw @Eve rt: Słowa zawierają tylko znaki alfa, cyfry i podkreślenia, więc jeśli masz skróty lub inne elementy, to nie działa.
- @ Cyrus Nauczyłem się drugiego podczas używania vi / vim
*
na słowach. - Nie działa dla żadnego specjalnego znaku, na przykład
org.apache.avro avro
zorg.apache.avro avro+mapred
(próbowano z *) - Użyj
-wE
, aby uzyskać dokładne informacje dopasowanie wielu słów (logiczne OR)
Odpowiedź
Spróbuj tego z GNU grep
i oznacz granice słów \b
:
grep "\bdeiauk\b" file
Wynik:
deiauk 1611516 afsdf 765
Zobacz: http://www.regular-expressions.info/wordboundaries.html
Komentarze
- Dziękuję, ale dlaczego to nie działa?
echo "Enter login: " $vard
grep -E "$\bvard\b" file.txt
- Wypróbuj
grep "\b${vard}\b" file.txt
- nadal nie ' t działa: /
- Ty ' będziesz potrzebować
read
:read -p "Enter login: " vard; grep "\b${vard}\b" file.txt
Odpowiedź
Jeśli grep
obsługuje -P
(PCRE), możesz to zrobić:
$ grep -P "(^|\s)\Kdeiauk(?=\s|$)" file.txt deiauk 1611516 afsdf 765 deiauk 1611516 afsdf ddfgfgd
Komentarze
- To jedyna odpowiedź, która działa ze słowami z łącznikami.
- Dlaczego
\K
( Czy potrzebny jest reset PCRE na początku meczu)? To proponowane rozwiązanie wydaje się działać dobrze bez niego.
Odpowiedź
W zależności od prawdziwych danych poszukaj słowa, po którym następuje spacja:
grep "deiauk " file.txt
Jeśli wiesz, że musi znajdować się na początku linii, sprawdź, czy:
grep "^deiauk " file.txt
Komentarze
- Niestety wszystkie inne odpowiedzi są niepoprawne.
- @Shatu Thanks! Pozwól więc ' zobaczyć, ile czasu zajmie, zanim " pojawi się na górze " … Ja ' Jestem zaciekawiony, ponieważ lubię dodawać odpowiedzi na stare pytania … Wydaje mi się, że tak jest, ale wątpię. Byłoby to dla mnie po prostu miłe, ale faktycznie przydatne dla czytelników. Aby uczynić to dobrym przykładem, czy mogę prosić o napisanie komentarza podsumowującego brakujące odpowiedzi w innych odpowiedziach?
- (1) Gratulujemy osiągnięcia 10 tys. Powtórzeń. Masz teraz przywilej zobaczyć, że ta odpowiedź została udzielona 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 podawać odpowiedzi, która działa tylko w przypadku przykładowych danych. Z przykładowych danych w pytaniu wynika, że kolumny są oddzielone spacjami – ale nie zostało to określone. Wszystkie inne odpowiedzi będą również działać w przypadku kolumn rozdzielonych tabulatorami. (3) Uniknąłeś fatalnego błędu w (usuniętej) odpowiedzi tachomi, dodając
^
– ale wszystkie inne odpowiedzi działają… (cd.) - ( Cd)… jeśli ciąg występuje w polu innym niż pierwsze. (4) Ponadto wszystkie inne odpowiedzi działają, jeśli „deiauk” jest ostatnim polem (tj. Po nim nic nie ma).
Odpowiedz
Znalazłem -x
działało dla mnie.
Przykład
$ 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 $.
Komentarze
- Aby dopasować 1: 1 cały wiersz zawierający łączniki,
-x
jedyna opcja. Na przykładgrep -w "abc" <<<"abc-hac101-bb0"
będzie pasować, alegrep -x "abc" <<<"abc-hac101-bb0"
nie będzie
grep -w
? (Ta opcja jest dokładnie do tego celu i działa dla mnie.) – Uwaga: opcja-x
pasuje do całej linii.deiauk
/ " Potrzebuję tylko tego:deiauk 1611516 afsdf 765
" – czego potrzebujesz?