2017-12-22 1 views
-2

haben zwei Dateien:
file1 ist mit den Schlüsselwörtern - INFO ERROR
file2 wird die Liste der Protokolldateien Pfad - path1 path2
ich brauche, um zu beenden aus dem Skript wenn eine der Bedingungen in einer der Schleifen fehlgeschlagen ist. HierWhile-Schleifen in Unix-Scripting

ist der Code:

#!/bin/bash 
RC=0 
while read line 
do 
    echo "grepping from the file $line 
    if [ -f $line ]; then 
    while read key 
    do 
     echo "searching $key from the file $line 
     if [ condition ]; then 
      RC=0; 
     else 
      RC=1; 
      break; 
     fi 
    done < /apps/file1 
else 
    RC=1; 
    break; 
fi 
done < apps/file2 
exit $RC 

Thank you!

Antwort

0

ersetzen condition mit $(grep -c ${key} ${line}) -gt 0 wie folgt aus:

echo "searching $key from the file $line 
     if [ $(grep -c ${key} ${line}) -eq 0 ]; then 

Es wird die jedes Schlüsselwort in Ihre Log-Datei zählen. Wenn count = 0 (Muster wurde nicht gefunden), wird then ausgeführt. Wenn mindestens eine Taste gefunden wurde, wird else, RC=1 ausgeführt und der Loop wird beendet.

Und seien Sie sicher, dass Ihre Schlüsselwörter nicht Teilstrings der längsten Wörter sein können, sonst erhalten Sie einen Fehler.

Beispiel:

[[email protected] Stackoverflow]$ cat file 
correctstringERROR and more useless text 

ERROR thats really error string 
[[email protected] Stackoverflow]$ grep -c ERROR file 
2 

Wenn Sie Zählung vermeiden möchten 2 (da erste String zählen, obliviously, schlechte Art und Weise), sollten Sie auch zwei Tasten für grep hinzufügen:

[[email protected] Stackoverflow]$ grep -cow ERROR file 
1 

Sie jetzt habe nur die Wörter gleich zu Ihrem Schlüssel, nicht Teilstrings in irgendwelchen nützlichen Zeichenfolgen gezählt.

1

Die ansewer auf Ihre Frage wird mit break 2:

while true; do 
    sleep 1 
    echo "outer loop" 
    while true; do 
     echo "inner loop" 
     break 2 
    done 
done 

ich dies nie benutzen, es ist schrecklich, wenn man verstehen will, oder den Code zu ändern. Schon besser wird mit einem boolean

found_master= 
while [ -n "${found_master}" ]; do 
    sleep 1 
    echo "outer loop" 
    while true; do 
     echo "inner loop" 
     found_master=true 
     break 
    done 
done 

Wenn Sie die Variable nicht brauchen found_master es ein hässliches zusätzliches Variable ist.
Sie können eine Funktion

inner_loop() { 
    local i=0; 
    while ((i++ < 5)); do 
     ((random=$RANDOM%5)) 
     echo "Inner $i: ${random}" 
     if [ ${random} -eq 0 ]; then 
     echo "Returning 0" 
     return 0 
     fi 
    done; 
    return 1; 
} 

j=0 
while ((j++ < 5)); do 
    echo "Out loop $j" 
    inner_loop 
    if [ $? -eq 0 ]; then 
     echo "inner look broken" 
     break 
    fi 
done 

Aber Ihre ursprüngliche Problem kann ohne zwei While-Schleifen Griffe sein verwenden. Sie können grep -E "INFO|ERROR" file2 verwenden oder die Schlüsselwörter kombinieren. Wenn sich die Schlüsselwörter in file1 in verschiedenen Zeilen befinden, können Sie grep -f file1 file2 verwenden.