2016-04-05 14 views
3

Ich habe einige Daten in einer flachen Datei gespeichert, ähnlich den Daten, die unten gezeigt werden. Ich muss in der Lage sein, die Daten in Variablen zu extrahieren, z. B. die Variable AGE ist gleich 24 und die Variable user ist gleich user01. Ich muss auch in der Lage sein zu sagen, für welche Datenbank die Daten sind, wie db [0] und db [1] und so weiter.Lesen von Text aus einer flachen Datei in Variablen

db[0].age="24" 
db[0].user="user01" 
db[0].password="pasword01" 
db[0].office="usa office 1" 

db[1].age="44" 
db[1].userID="user01" 
db[1].userPW="password02" 
db[1].office="uk office 2" 

Was ich bisher getan habe, ist awk zu verwenden für alle Instanzen des Alters zu suchen und extrahieren die Anzahl die eckigen Klammern in ein Array ist.

databaseCount=($(awk '/'"age"'/' flatFile | cut -d "[" -f2 | cut -d "]" -f1)) 

ich dann dachte ein ähnliches awk mit dem Text in den Klammern gefunden zu extrahieren und diese Daten in ein Array stellen.

age=($(awk '/'"dbUserAlias"'/' flatFile | cut -d\" -f2)) 

ich dann wurde die Planung der Database unter Verwendung der Daten für weach Array zu finden, so würde ich wissen, dass die im Element 0 des Alters Array gefunden Daten für Datenbank ist 0 und die Daten im Element gefunden 1 OFR-Datenbank 1.

Das Problem, das ich habe, ist, dass ein Teil des Textes zwischen den Sprachmarken Leerzeichen gefunden hat.

Würde "uk" anstelle von "uk office 2" zurückgeben.

Weiß jemand, wie man das behebt, oder ob es eine bessere Möglichkeit gibt, die Daten zu extrahieren?

Vielen Dank.

+0

Haben Sie ein vorhandenes Bash-Skript, das diese Daten benötigt? Oder versuchst du das nur für ein noch nicht geschriebenes Skript zu verarbeiten? Wenn letzteres dann alles nur in awk direkt macht. Diese Eingabe ist in der Tat praktisch schon awk (und könnte in ein gültiges awk manipuliert werden, falls gewünscht oder von awk geparst werden, was "sicherer" sein könnte). Der Versuch, dies stückweise in Shell-Arrays aufzuteilen, verlangt nach Ärger. –

Antwort

0

Wenn Sie das Array auf diese Weise zugreifen Sie Ihre Elemente in doppelten Anführungszeichen kapseln sollten, ersetzen Sie den Code mit dem folgenden:

age=($(printf "\"$(awk '/'"dbUserAlias"'/' flatFile | cut -d\" -f2)\"")) 
0

Wenn die Flatfile wie

age="24" 

formatiert wurden kann man habe diese Datei bezogen.
Wenn Sie die db[n] ignorieren, können Sie

. <(cut -d"." -f2- flatFile) 

verwenden Nun wollen wir die Datei für jeden db aufzuspalten und zu verarbeiten, die Zeilen für jeden db:

for db in {0..5}; do 
    sourcelines=$(grep "^db\[${db}\]" flatFile) 
    if [[ -n "${sourcelines}" ]]; then 
     echo "Database db[${db}]" 
     . <(cut -d"." -f2- <<< "${sourcelines}") 
     # show the variables that have been set 
     set | grep -E "^age=|^userID=|^userPW=|^office=" | sort 
    fi 
done 

Wenn Sie verschiedene verwenden möchten Variablen für verschiedene Datenbanken, benötigen Sie eine kleine Änderung:

for db in {0..5}; do 
    sourcelines=$(grep "^db\[${db}\]" flatFile) 
    if [[ -n "${sourcelines}" ]]; then 
     echo "Database db[${db}]" 
     . <(echo -e "${sourcelines}" | tr "\[\]\." "_") 
     # show the variables that have been set 
     set | grep -E "^db_${db}_" | sort 
    fi 
done