Jeg har en tekstfil:
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
og I ønsker å matche nøyaktig deiauk
. Når jeg gjør dette:
grep "deiauk" file.txt
får jeg dette resultatet:
deiauk 1611516 afsdf 765 deiauk1 sdfsfdsfs 1561 51 deiauk2 115151 5454 4
men jeg trenger bare dette:
deiauk 1611516 afsdf 765 deiauk 1611516 afsdf ddfgfgd
Jeg vet det «sa -w
alternativet, men da må strengen min hele linje.
Kommentarer
Svar
Prøv en av:
grep -w "deiauk" textfile grep "\<deiauk\>" textfile
Kommentarer
- Hvis du har et bindestrek ( – ) på slutten av strengen dette skriptet vil gi det som et resultat, noe som ikke var forventet.
- Riktig @Eve rt: Ord inkluderer bare alfabetegn, sifre og understreker, så hvis du har forkortelser eller andre bindestrek, fungerer dette ikke.
- @Cyrus Jeg lærte den andre mens vi brukte vi / vim
*
kommando på ord. - Det fungerer ikke for noe spesialtegn det har for eksempel
org.apache.avro avro
betegnet medorg.apache.avro avro+mapred
(prøvd med *) - Bruk
-wE
for nøyaktig samsvar med flere ord (boolsk OR)
Svar
Prøv dette med GNU grep
og merk ordgrenser med \b
:
grep "\bdeiauk\b" file
Utgang:
deiauk 1611516 afsdf 765
Se: http://www.regular-expressions.info/wordboundaries.html
Kommentarer
- Takk, men hvorfor fungerer dette ikke for meg?
echo "Enter login: " $vard
grep -E "$\bvard\b" file.txt
- Prøv
grep "\b${vard}\b" file.txt
- fungerer fortsatt ikke ' t: /
- Du ' Du trenger
read
:read -p "Enter login: " vard; grep "\b${vard}\b" file.txt
Svar
Hvis din grep
støtter -P
(PCRE), du kan gjøre:
$ grep -P "(^|\s)\Kdeiauk(?=\s|$)" file.txt deiauk 1611516 afsdf 765 deiauk 1611516 afsdf ddfgfgd
Kommentarer
- Dette er det eneste svaret som fungerer med orddelte ord.
- Hvorfor er
\K
( PCRE reset av kampstart) nødvendig? Denne foreslåtte løsningen ser ut til å fungere fint uten den.
Svar
Avhengig av dine virkelige data, kan du se etter ordet etterfulgt av et mellomrom:
grep "deiauk " file.txt
Hvis du vet at det må være i begynnelsen av linjen, sjekk etter det:
grep "^deiauk " file.txt
Kommentarer
- Dessverre er alle andre svar enn dette feil.
- @Shatu Takk! Så la ' s se hvor lang tid det tar før det " boble opp til toppen " … Jeg ' er nysgjerrig fordi jeg liker å legge til svar på gamle spørsmål … Jeg tror det antas at det gjør det, men jeg tviler på det. Det ville være fint for meg, men faktisk nyttig for leserne. For å gjøre dette til et godt eksempel, kan jeg be deg om å skrive en kommentar som oppsummerer hva de andre svarene mangler?
- (1) Gratulerer med å ha nådd 10 000 rep. Du har nå privilegiet å se at dette svaret ble gitt før, og ble slettet. (2) Det er alltid bedre å svare på spørsmålet så bredt som mulig, basert på det som blir sagt, og ikke gi et svar som fungerer bare for eksempeldataene. Fra eksempeldataene i spørsmålet ser det ut til at kolonnene er atskilt med mellomrom – men det er ikke spesifisert. Alle de andre svarene vil også fungere for tabulaseparerte kolonner. (3) Du unngikk den fatale feilen i tachomis (slettede) svar ved å legge til
^
– men alle de andre svarene fungerer … (Fortsatt) - ( Fortsatt) … hvis strengen vises i et annet felt enn det første. (4) Alle de andre svarene fungerer også hvis deiauk er det siste feltet (dvs. det er ingenting etter det).
Svar
Jeg fant -x
fungerte for meg.
Eksempel
$ 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 $.
Kommentarer
- For 1: 1 som samsvarer med hele linjen som inneholder bindestreker,
-x
det eneste alternativet. For eksempelgrep -w "abc" <<<"abc-hac101-bb0"
vil matche, mengrep -x "abc" <<<"abc-hac101-bb0"
vil ikke
grep -w
? (Det alternativet er akkurat for det formålet , og det fungerer for meg.) – Merk: alternativ-x
samsvarer med hele linjen.deiauk
/ " Jeg trenger bare dette:deiauk 1611516 afsdf 765
" – hva trenger du?