Am un fișier text:
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 eu doresc să se potrivească exact cu deiauk
. Când fac acest lucru:
grep "deiauk" file.txt
Obțin acest rezultat:
deiauk 1611516 afsdf 765 deiauk1 sdfsfdsfs 1561 51 deiauk2 115151 5454 4
dar eu am nevoie doar de acest lucru:
deiauk 1611516 afsdf 765 deiauk 1611516 afsdf ddfgfgd
Știu că există o opțiune „sa -w
, dar șirul meu trebuie să fie întreg linie.
Comentarii
Răspundeți
Încercați una dintre:
grep -w "deiauk" textfile grep "\<deiauk\>" textfile
Comentarii
- Dacă aveți o liniuță ( – ) la sfârșitul șirului, acest script îl va aduce ca rezultat, ceea ce nu era de așteptat.
- Corectați @Eve rt: Cuvintele includ doar litere alfa, cifre și caractere de subliniere, deci dacă aveți abrevieri sau alte elemente cratimate, acest lucru nu funcționează.
- @Cyrus am învățat al doilea în timp ce foloseam vi / vim
*
pe cuvinte. - Nu funcționează pentru niciun caracter special pe care îl are de exemplu
org.apache.avro avro
greped cuorg.apache.avro avro+mapred
(încercat cu *) - Utilizați
-wE
pentru exact potrivire a mai multor cuvinte (OR boolean)
Răspuns
Încercați acest lucru cu GNU grep
și marcați limitele cuvintelor cu \b
:
grep "\bdeiauk\b" file
ieșire:
deiauk 1611516 afsdf 765
Vedeți: http://www.regular-expressions.info/wordboundaries.html
Comentarii
- Mulțumesc, dar de ce acest lucru nu funcționează pentru mine?
echo "Enter login: " $vard
grep -E "$\bvard\b" file.txt
- Încercați
grep "\b${vard}\b" file.txt
- încă nu funcționează ': /
- ' veți avea nevoie de
read
:read -p "Enter login: " vard; grep "\b${vard}\b" file.txt
Răspuns
Dacă grep
acceptă -P
(PCRE), puteți face:
$ grep -P "(^|\s)\Kdeiauk(?=\s|$)" file.txt deiauk 1611516 afsdf 765 deiauk 1611516 afsdf ddfgfgd
Comentarii
- Acesta este singurul răspuns care funcționează cu cuvinte cratimate.
- De ce este
\K
( PCRE reset start start of match) este necesar? Această soluție propusă pare să funcționeze foarte bine fără ea.
Răspuns
În funcție de datele dvs. reale, ați putea căutați cuvântul urmat de un spațiu:
grep "deiauk " file.txt
Dacă știți că trebuie să fie la începutul liniei, verificați-l:
grep "^deiauk " file.txt
Comentarii
- Din păcate, toate răspunsurile, altele decât acestea, sunt incorecte.
- @Shatu Mulțumesc! Deci, să vedem ' s cât durează până la " balon până la partea de sus " … Sunt ' curios pentru că îmi place să adaug răspunsuri la întrebări vechi … Cred că se presupune că da, dar mă îndoiesc. Ar fi frumos pentru mine, dar de fapt util pentru cititori. Pentru ca acest exemplu să fie un exemplu bun, aș putea să vă rog să scrieți un comentariu care să rezume ce lipsesc celelalte răspunsuri?
- (1) Felicitări pentru că ați atins 10.000 de rep. Acum aveți privilegiul să vedeți că acest răspuns a fost dat anterior și a fost șters. (2) Este întotdeauna mai bine să răspundeți la întrebare cât mai larg posibil, pe baza a ceea ce se spune, și să nu dați un răspuns care să funcționeze doar pentru datele eșantionului. Din datele de exemplu din întrebare, se pare că coloanele sunt separate prin spații – dar acest lucru nu este specificat. Toate celelalte răspunsuri vor funcționa și pentru coloanele separate prin tab. (3) Ați evitat defectul fatal în răspunsul lui Tachomi (șters) adăugând
^
– dar toate celelalte răspunsuri funcționează … (Continuare) - ( Continuat) … dacă șirul apare într-un alt câmp decât primul. (4) De asemenea, toate celelalte răspunsuri funcționează dacă „deiauk” este ultimul câmp (adică nu mai este nimic după el).
Răspuns
Am găsit că -x
a funcționat pentru mine.
Exemplu
$ 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 $.
Comentarii
- Pentru 1: 1 care corespunde întregului rând care conține cratime,
-x
singura opțiune. De exemplu,grep -w "abc" <<<"abc-hac101-bb0"
se va potrivi, dargrep -x "abc" <<<"abc-hac101-bb0"
nu
grep -w
? (Această opțiune este exact în acest scop , și funcționează pentru mine.) – Notă: opțiunea-x
se potrivește cu întreaga linie.deiauk
/ " Am nevoie doar de acest lucru:deiauk 1611516 afsdf 765
" – de ce aveți nevoie?