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
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 medorg.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 kommergrep -w "abc" <<<"abc-hac101-bb0"
att matcha mengrep -x "abc" <<<"abc-hac101-bb0"
kommer inte
grep -w
? (Det alternativet är exakt för det ändamålet , och det fungerar för mig.) – Obs: alternativ-x
matchar hela raden.deiauk
/ " Jag behöver bara detta:deiauk 1611516 afsdf 765
" – vad behöver du?