an. 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 I. möchte genau übereinstimmen deiauk. Wenn ich das mache:

grep "deiauk" file.txt 

Ich erhalte folgendes Ergebnis:

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

aber ich brauche nur folgendes:

deiauk 1611516 afsdf 765 deiauk 1611516 afsdf ddfgfgd 

Ich weiß, dass es eine „div -w Option gibt, aber dann muss mein String ganz sein Zeile.

Kommentare

  • Haben Sie tatsächlich versucht grep -w? (Diese Option ist genau für diesen Zweck und es funktioniert für mich.) – Hinweis: Die Option -x entspricht der gesamten Zeile.
  • " Ich möchte genau übereinstimmen deiauk / " Ich brauche nur Folgendes: deiauk 1611516 afsdf 765 " – welche benötigen Sie?

Antwort

Probieren Sie eine der folgenden Methoden aus:

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

Kommentare

  • Wenn ja Ein Bindestrich () am Ende der Zeichenfolge, den dieses Skript als Ergebnis anzeigt, was nicht erwartet wurde.
  • Korrigieren Sie @Eve rt: Wörter enthalten nur Alpha-Zeichen, Ziffern und Unterstriche. Wenn Sie also Abkürzungen oder andere Elemente mit Bindestrich haben, funktioniert dies nicht.
  • @Cyrus Ich habe das zweite gelernt, während ich vi / vim * Befehl für Wörter.
  • Es funktioniert nicht für Sonderzeichen, die beispielsweise org.apache.avro avro mit org.apache.avro avro+mapred (versucht mit *)
  • Verwenden Sie -wE für genaue Übereinstimmung mehrerer Wörter (boolesches ODER)

Antwort

Versuchen Sie dies mit GNU grep und markieren Sie Wortgrenzen mit \b:

grep "\bdeiauk\b" file 

Ausgabe:

 deiauk 1611516 afsdf 765 

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

Kommentare

  • Danke, aber warum funktioniert das bei mir nicht? echo "Enter login: " $vard grep -E "$\bvard\b" file.txt
  • Versuchen Sie grep "\b${vard}\b" file.txt
  • funktioniert immer noch nicht ': /
  • Sie ' benötigen read: read -p "Enter login: " vard; grep "\b${vard}\b" file.txt

Antwort

Wenn Ihr grep unterstützt -P (PCRE). Sie können Folgendes tun:

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

Kommentare

  • Dies ist die einzige Antwort, die mit getrennten Wörtern funktioniert.
  • Warum ist \K ( PCRE Reset Start of Match) benötigt? Diese vorgeschlagene Lösung scheint ohne sie einwandfrei zu funktionieren.

Antwort

Abhängig von Ihren tatsächlichen Daten können Sie dies tun Suchen Sie nach dem Wort, gefolgt von einem Leerzeichen:

grep "deiauk " file.txt 

Wenn Sie wissen, dass es am Anfang der Zeile stehen muss, überprüfen Sie es:

grep "^deiauk " file.txt 

Kommentare

  • Leider sind alle anderen Antworten falsch.
  • @Shatu Danke! Lassen Sie also ' sehen, wie lange es dauert, bis " nach oben sprudelt " … Ich ' bin neugierig, weil ich gerne Antworten auf alte Fragen hinzufüge … Ich denke, es wird angenommen, dass dies der Fall ist, aber ich bezweifle es. Es wäre einfach schön für mich, aber tatsächlich nützlich für die Leser. Könnte ich Sie bitten, einen Kommentar zu verfassen, in dem die anderen fehlenden Antworten zusammengefasst werden?
  • (1) Herzlichen Glückwunsch zum Erreichen von 10.000 Wiederholungen. Sie haben jetzt das Privileg zu sehen, dass diese Antwort zuvor gegeben und gelöscht wurde. (2) Es ist immer besser, die Frage so weit wie möglich zu beantworten, basierend auf was gesagt wird, und keine Antwort zu geben, die nur für die Beispieldaten funktioniert. Aus den Beispieldaten in der Frage geht hervor, dass die Spalten durch Leerzeichen getrennt sind – dies ist jedoch nicht angegeben. Alle anderen Antworten funktionieren auch für durch Tabulatoren getrennte Spalten. (3) Sie haben den schwerwiegenden Fehler in der (gelöschten) Antwort von Tachomi vermieden, indem Sie die ^ hinzugefügt haben – aber alle anderen Antworten funktionieren… (Fortsetzung)
  • ( Fortsetzung)… wenn die Zeichenfolge in einem anderen Feld als dem ersten angezeigt wird. (4) Alle anderen Antworten funktionieren auch, wenn deiauk das letzte Feld ist (dh es gibt nichts danach).

Antwort

Ich habe festgestellt, dass -x für mich funktioniert hat.

Beispiel

$ 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 $. 

Kommentare

  • Für 1: 1, das mit der gesamten Zeile übereinstimmt, die Bindestriche enthält, -x die einzige Option. Zum Beispiel stimmt grep -w "abc" <<<"abc-hac101-bb0" überein, grep -x "abc" <<<"abc-hac101-bb0" jedoch nicht

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.