Jag har en textfil:

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 

och I vill matcha exakt deiauk. När jag gör detta:

grep "deiauk" file.txt 

får jag det här resultatet:

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

men jag behöver bara detta:

deiauk 1611516 afsdf 765 deiauk 1611516 afsdf ddfgfgd 

Jag vet att det finns ”sa -w alternativ, men då måste min sträng bearbeta hela rad.

Kommentarer

  • Har du faktiskt provat grep -w? (Det alternativet är exakt för det ändamålet , och det fungerar för mig.) – Obs: alternativ -x matchar hela raden.
  • " Jag vill matcha exakt deiauk / " Jag behöver bara detta: deiauk 1611516 afsdf 765 " – vad behöver du?

Svar

Testa något av:

grep -w "deiauk" textfile grep "\<deiauk\>" textfile 

Kommentarer

  • Om du har ett streck () i slutet av strängen kommer detta skript att ge det som ett resultat, vilket inte förväntades.
  • Rätt @Eve rt: Ord innehåller endast alfabetecken, siffror och understrykningar, så om du har förkortningar eller andra bindestreck fungerar det inte.
  • @Cyrus Jag lärde mig den andra medan vi använde vi / vim * kommando på ord.
  • Det fungerar inte för något specialtecken som det har till exempel org.apache.avro avro greped med org.apache.avro avro+mapred (försökt med *)
  • Använd -wE för exakt matchning av flera ord (boolesk ELLER)

Svar

Prova detta med GNU grep och markera ordgränser med \b:

grep "\bdeiauk\b" file 

Output:

 deiauk 1611516 afsdf 765 

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

Kommentarer

  • Tack men varför fungerar det inte för mig? echo "Enter login: " $vard grep -E "$\bvard\b" file.txt
  • Försök grep "\b${vard}\b" file.txt
  • fungerar fortfarande inte ': /
  • Du ' kommer att behöva read: read -p "Enter login: " vard; grep "\b${vard}\b" file.txt

Svar

Om din grep stöder -P (PCRE), du kan göra:

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

Kommentarer

  • Detta är det enda svaret som fungerar med bindestreck.
  • Varför är \K ( PCRE-återställning av matchstart) behövs? Den här föreslagna lösningen verkar fungera bra utan den.

Svar

Beroende på dina verkliga data kan du leta efter ordet följt av ett mellanslag:

grep "deiauk " file.txt 

Om du vet att det måste vara i början av raden, kolla efter det:

grep "^deiauk " file.txt 

Kommentarer

  • Tyvärr är alla andra svar än detta felaktiga.
  • @Shatu Tack! Så låt ' se hur lång tid det tar innan " bubblar upp till toppen " … Jag ' är nyfiken eftersom jag gillar att lägga till svar på gamla frågor … Jag tror det antas att det gör det, men jag tvivlar på det. Det skulle bara vara trevligt för mig, men faktiskt användbart för läsarna. För att göra detta till ett bra exempelfall kan jag be dig att skriva en kommentar som sammanfattar vad de andra svaren saknas?
  • (1) Grattis till att du uppnått 10 000 rep. Du har nu privilegiet att se att svaret ges tidigare och raderades. (2) Det är alltid bättre att svara på frågan så brett som möjligt, baserat på vad som sägs, och inte ge ett svar som fungerar bara för exempeldata. Det framgår av exemplets data i frågan att kolumnerna är åtskilda av mellanslag – men det anges inte. Alla andra svar fungerar också för flikavgränsade kolumner. (3) Du undviker den allvarliga bristen i tachomis (borttagna) svar genom att lägga till ^ – men alla andra svar fungerar … (Fortsatt)
  • ( Fortsatt) … om strängen visas i ett annat fält än det första. (4) Alla andra svar fungerar också om deiauk är det sista fältet (dvs. det finns inget efter det).

Svar

Jag hittade -x fungerade för mig.

Exempel

$ 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

  • För 1: 1 som matchar hela raden som innehåller bindestreck, -x det enda alternativet. Till exempel kommer grep -w "abc" <<<"abc-hac101-bb0" att matcha men grep -x "abc" <<<"abc-hac101-bb0" kommer inte

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *