Gibt nur die Zeilennummer zurück, wenn das Muster 'Exist' und 'Not Exist' vorliegt. mit 'grep' befehl

1

Ich habe diese Beispieldatei für meine Eingabe:

xyxxyx xyxx xxyx yxyy yxyx
xxyxxx xx xyx xxx x y x xxyy
yxxy xyxxy xxy y x y
xyxy xyx yyxx xyyxyxy xyx
yxyy xyy yxyx xxyxyyx

Und ich habe versucht, nur ein "xyx"Wort zu finden, wenn es in der Zeile und in der Rückleitungsnummer existiert. Zum Beispiel haben in dieser Eingabe nur Zeile 2 und 4 "xyx", und das gewünschte Ergebnis wäre nur 2 und 4 (Zeilennummern), aber der grepBefehl gibt mir alle 5 Zeilen. dieses Ergebnis:

grep -n "xyx" test | cut -f1 -d:
1
2
3
4
5

Wenn ich Befehl ausführen folgen , ohne cut -f1 -d"ich , dass alle finden zu sehen "xyx", wie in "xyxxyx", "xyxx", "xxyx"und "yxyx"zum Beispiel in erster Linie, während das falsch ist, mein Muster nur und nur in Zeile 2 und 4 vorhanden ist, und es ist drittes Wort in Zeile 2 und die zweiten & 5. Wort in Zeile 4. Siehe Screenshot:

                          Bildbeschreibung hier eingeben

Und das Ergebnis, was ich will, ist, nur getrennte "xyx"und Rückleitungsnummer davon zu finden.

Ausgabe von Ich wünschte, wenn Muster vorhanden sind, ist es nur:

2
4

Ausgabe von Ich wünschte, wenn Muster nicht vorhanden ist, ist es nur:

1
3
5

und ich weiß auch nicht, welchen Befehl ich verwenden soll, um zu überprüfen, ob Muster nicht vorhanden sind. Ich habe versucht, mit allen möglichen grepBefehlskombinationen, aber ich habe versagt.

Vielen Dank für Ihre Mithilfe im Voraus.

αғsнιη
quelle

Antworten:

2

Sie müssen die -wOption hinzufügen

$ grep -wn 'xyx' file | cut -d: -f1
2
4

Von man grep

   -w, --word-regexp
          Select  only  those  lines  containing  matches  that form whole
          words.  The test is that the matching substring must  either  be
          at  the  beginning  of  the  line,  or  preceded  by  a non-word
          constituent character.  Similarly, it must be either at the  end
          of  the  line  or  followed by a non-word constituent character.
          Word-constituent  characters  are  letters,  digits,   and   the
          underscore.

Um die Übereinstimmung umzukehren, fügen Sie den -vSchalter hinzu, dh

grep -vwn 'xyx' file | cut -d: -f1
Stahlfahrer
quelle
Danke. Ich möchte auch wissen, wie man prüft, ob ein Muster nicht existiert und das Ergebnis 1 3 5.
αғsнιη
Ich habe es hinzugefügt
steeldriver