2016-05-31 14 views
0

Ich versuche zu überprüfen, ob alle angegebenen Muster in einer Datei vorhanden sind. Wenn ja, zeige Erfolg.Bash: Wie überprüft man, ob alle zu prüfenden Muster in einer Datei in Unix vorhanden sind

zB: Ich habe eine Datei wie unten

$ cat test.txt 
ABC 
123 
xyz 
ABC 
MNO 
qwe 
$ 

ich die Muster haben, sind zu suchen ABC und 123. Im obigen Fall sollte es also Erfolg zeigen.

Wenn mein Muster ABC und 234 ist, sollte es FAILURE anzeigen.

Ich habe wie unten versucht:

$ grep -e ABC -e 123 test.txt && echo "SUCCESS" || echo "FAIL" 
ABC 
123 
ABC 
SUCCESS 
$ 
$ grep -e ABC -e 234 test.txt && echo "SUCCESS" || echo "FAIL" 
ABC 
ABC 
SUCCESS 
$ 

Aber die oben wird der Erfolg zurück, auch wenn ein Muster auch ausfällt.

Auch versucht wie unten. Aber es dauert 2 Iterationen in der Datei.

$ grep -w "ABC" test.txt && grep -w "123" test.txt && echo "SUCCESS" || echo "FAIL" 
ABC 
ABC 
123 
SUCCESS 
$ grep -w "ABC" test.txt && grep -w "234" test.txt && echo "SUCCESS" || echo "FAIL" 
ABC 
ABC 
FAIL 
$ 

Hilfe, um dies in einem einzigen Parsing der Datei zu erreichen?

+0

Im Grunde wollte ich wissen, ob AND-Operation mit grep nach Mustern .Auch möglich ist, was ist der effizienteste Weg, dies zu erreichen? –

Antwort

2

Sie können so zu tun Verwendung ein awk Befehl verwenden:

awk -v patt='ABC,123' 'BEGIN { 
    n = split(patt, words, /,/) 
} 
n { 
    for (i in words) 
     if ($0 ~ "\\<" words[i] "\\>") { 
     --n 
     delete words[i] 
     } 
} 
END { 
    exit n 
}' test.txt && echo "SUCCESS" || echo "FAIL" 

Erläuterung:

  • Dieser awk alle Wörter vergeht in einem Komma geteilten Befehlszeilenargument suchen patt
  • Im BEGIN Block füllen wir ein Array words, indem wir das Eingabefeld aufteilen und speichern Anzahl der Wörter in der Variable n
  • suchen, wenn n > 0 wir eine Wortsuche für jedes Element des Arrays in einer Linie ausführen und wenn gesuchte Wort gefunden wird, wir das Wort aus dem Feld löschen und dekrementieren n
  • Im END Block Wenn Sie mit dem Wert n beenden, wird 0 (oder Erfolg) zurückgegeben, wenn alle Wörter gefunden wurden.
+1

Gibt nicht das gleiche Verhalten wie das Flag "-w" für Grep. – 123

+1

Guter Punkt, ich aktualisiert, um es zu einer Wortsuche zu machen – anubhava

+1

Es scheint zu arbeiten .Können Sie bitte erklären Sie die Logik mit Split-Befehl und Gesamtablauf. Ich bin nicht sehr vertraut mit awk –

-1
grep -q 123 fileName && grep -q ABC fileName && echo "Matched" || echo "not matched" 
    Matched 
    grep -q 123 fileName && grep -q ABQQC fileName && echo "Matched" || echo "not matched" 
    not matched 
    grep -q 1ZZ23 fileName && grep -q ABC fileName && echo "Matched" || echo "not matched" 
    not matched 
    grep -q 1ZZ23 fileName && grep -q ABCQQ fileName && echo "Matched" || echo "not matched" 
    not matched