2016-09-29 12 views
-1

Ich schreibe ein Bash-Skript, um zu überprüfen, ob ein Array-Element in einer Datei ist.Überprüfen Sie, ob ein Array-Element in einer Datei ist

Zum Beispiel:

Ich habe eine Reihe von Fehlern errors=("1234" "5678" "9999")

Ich habe eine Datei, die

123400 452612 9999A0 1010EB

ich über die Datei Schleife Suche Muster von Strings enthält, die enthält die Fehler und überprüfen, ob eines der Array-Elemente mit einem beliebigen String-Muster in der Datei übereinstimmt. Wenn dies der Fall ist, geben Sie mir das genaue Array-Muster zurück, das in der Datei zur weiteren Verarbeitung gefunden wurde.

Irgendwelche Ideen, wie ich das machen kann?

+0

Es gibt mehrere Zeilen in der Datei? (oder) nur eine einzige Linie mit diesen festen Mustern? – Inian

+0

Können die Fehler irgendwo in der Datei auftreten? –

+0

Die Fehler können überall in der Datei auftreten. Die Datei enthält mehrere Zeilen ohne feste Länge. –

Antwort

1

Das Skript wie das geht,

#/bin/bash 
errors=("1234" "5678" "9999") 

for error in "${errors[@]}" 
do 
    grep -o "$error" file 
done 

Für eine Beispieldatei,

$ cat file 
123400 452612 9999A0 1010EB 

Das Skript erzeugt eine Ausgabe

$ ./script.sh 
1234 
9999 

die beiden oben genannten Schlüssel aus dem Array Bedeutung haben in der Datei übereinstimmen. Das -o Flag in grep soll nur die übereinstimmenden Teile aus dem Array identifizieren. Ein Auszug aus der man grep Seite.

-o, --only-matching 
     Print only the matched (non-empty) parts of a matching line, with each such part on a separate output line. 
+0

Danke Inian. Genau wonach ich suche –

2

Klingt wie Sie gerade eine Schleife wollen:

for error in "${errors[@]}"; do 
    if grep -qE "(^|)$error(|\$)" file; then 
     # $error was found in the file 
    fi 
done 

Dies entspricht dem vom Anfang der Zeile voran Fehler oder einen Raum, und durch ein Leerzeichen oder das Ende der Linie gefolgt.

ich eine Anstrengung zu nicht Spiel Auftritte der Fehler innerhalb von Teil gemacht, aber wenn Sie nicht kümmern, dann könnte man den Befehl grep dazu ändern:

grep -qF "$error" file 

Dies wird Erfolg zurück, wenn die Error String tritt irgendwo in der Zeile auf.

3

Hier ist eine Art und Weise, wo Sie brauchen nur grep einmal aufzurufen:

$ grep -oFf <(printf "%s\n" "${errors[@]}") file 
1234 
9999 

Die -f Option ist eine Datei angeben, die das Muster enthält. Ich verwende eine Prozesssubstitution, um die Muster zu "enthalten", eines pro Zeile.

Die -F Option spezifiziert Klartext-Übereinstimmung: Ich nehme an, dass Ihr "Fehler" -Array keine regulären Ausdrücke enthält.

Verwandte Themen