Genaue Übereinstimmung mit grep


63

Ich habe eine Textdatei:

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

und ich will genau passen deiauk. Wenn ich das mache:

grep "deiauk" file.txt

Ich bekomme dieses Ergebnis:

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

aber ich brauche nur das:

deiauk 1611516 afsdf 765
deiauk 1611516 afsdf ddfgfgd

Ich weiß, dass es eine -wOption gibt, aber dann muss meine Zeichenfolge die ganze Linie machen.


4
Hast du es tatsächlich versucht grep -w? (Diese Option ist genau für diesen Zweck vorgesehen und funktioniert bei mir.) - Hinweis: Die Option -xentspricht der gesamten Zeile.
Janis

"Ich möchte genau passendeiauk / " Ich brauche nur Folgendes: deiauk 1611516 afsdf 765" - was brauchst du?
alex

Antworten:


128

Versuchen Sie eines von:

grep -w "deiauk" textfile

grep "\<deiauk\>" textfile

3
Wenn Sie einen Bindestrich ( - ) am Ende der Zeichenfolge haben, wird dieses Skript es als Ergebnis bringen, was nicht erwartet wurde.
Evis

Richtiges @Evert: Wörter enthalten nur Buchstaben, Ziffern und Unterstriche. Wenn Sie also Abkürzungen oder andere Elemente mit Bindestrich haben, funktioniert dies nicht.
am

@ Cyrus Ich habe den zweiten gelernt, als ich den *Befehl vi / vim für Wörter verwendet habe.
Shuva

Es funktioniert nicht für Sonderzeichen, mit denen es zum Beispiel org.apache.avro avrogreped hat org.apache.avro avro+mapred(versucht mit *)
Vishrant

12

Versuchen Sie dies mit GNU grepund markieren Sie Wortgrenzen mit \b:

grep "\bdeiauk\b" file

Ausgabe:

deiauk 1611516 afsdf 765

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


Danke, aber warum funktioniert das bei mir nicht? echo "Enter login: " $vard grep -E "$\bvard\b" file.txt
user3334375

Versuchen Siegrep "\b${vard}\b" file.txt
Cyrus

1
funktioniert immer noch nicht: /
user3334375

Sie benötigen read:read -p "Enter login: " vard; grep "\b${vard}\b" file.txt
Cyrus

7

Wenn Ihre grepUnterstützung -P(PCRE), können Sie Folgendes tun:

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

4
Dies ist die einzige Antwort, die mit getrennten Wörtern funktioniert.
am

5

Abhängig von Ihren tatsächlichen Daten können Sie nach dem Wort suchen, auf das ein Leerzeichen folgt:

grep 'deiauk ' file.txt 

Wenn Sie wissen, dass es sich am Anfang der Zeile befinden muss, überprüfen Sie Folgendes:

grep '^deiauk ' file.txt 

Leider sind alle anderen Antworten falsch.
Shatu

@ Shatu Danke! Also mal sehen, wie lange es dauert, bis es "nach oben sprudelt" ... Ich bin neugierig, weil ich gerne Antworten auf alte Fragen hinzufüge ... Ich denke, es wird angenommen, dass es so ist, aber ich bezweifle es. Es wäre einfach nett für mich, aber tatsächlich nützlich für die Leser. Um dies zu einem guten Beispiel zu machen, könnte ich Sie bitten, einen Kommentar zu verfassen, in dem zusammengefasst wird, welche anderen Antworten fehlen?
Volker Siegel

(1) Herzlichen Glückwunsch zum Erreichen von 10K rep. Sie haben jetzt das Privileg, zu sehen, dass diese Antwort zuvor gegeben und gelöscht wurde. (2) Es ist immer besser, die Frage auf der Grundlage des Gesagten so weit wie möglich zu beantworten und keine Antwort zu geben, die nur für die Beispieldaten geeignet ist. Aus den Beispieldaten in der Frage geht hervor, dass die Spalten durch Leerzeichen getrennt sind - aber das ist nicht angegeben. Alle anderen Antworten funktionieren auch für durch Tabulatoren getrennte Spalten. (3) Sie haben den fatalen Fehler in Tachomis (gelöschter) Antwort vermieden, indem Sie die ^- aber alle anderen Antworten funktionieren ... (Fortsetzung)
G-Man

(Fortsetzung)… wenn die Zeichenfolge in einem anderen als dem ersten Feld angezeigt wird. (4) Alle anderen Antworten funktionieren auch, wenn '' deiauk '' das letzte Feld ist (dh es folgt nichts).
G-Man
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.