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
mitorg.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 stimmtgrep -w "abc" <<<"abc-hac101-bb0"
überein,grep -x "abc" <<<"abc-hac101-bb0"
jedoch nicht