2016-04-05 18 views
3

私はいくつかのデータをフラットファイルに保存していますが、以下に示すデータと似ています。変数AGEが24で、変数userがuser01に等しいというような変数にデータを抽出できるようにする必要があります。私はまた、db [0]やdb [1]のように、どのデータベースにデータがあるかを知ることができる必要があります。私はこれまで何をやったかフラットファイルから変数へのテキストの読み込み

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" 

は年齢のすべてのインスタンスを検索し、番号が配列に角括弧で抽出するためにはawkを使用することです。

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

次に、同様のawkを使用して、角括弧内のテキストを抽出し、そのデータを配列に格納することを考えていました。

私はその後、weachアレイのデータを見つけることdatabaseCountを使用して計画していたので、私は年齢配列の要素0で検出されたデータは、データベース0のためのものであり、要素1で検出されたデータがあることを知っているであろう
age=($(awk '/'"dbUserAlias"'/' flatFile | cut -d\" -f2)) 

ofrデータベース1

問題は、スピーチマークの間に見つかったテキストの一部にスペースが含まれていることです。

echo ${office[0]} 

"uk office 2"の代わりに "uk"を返します。

誰でもこれを修正する方法を知っていますか、またはデータを抽出するためのよりよい方法がある場合は、

ありがとうございます。あなたは二重引用符であなたの要素をカプセル化するべきである方法で、アレイにアクセスした場合

+0

このデータを必要とする既存のbashスクリプトがありますか?それとも、まだ書かれていないスクリプトのためにこれを処理しようとしていますか?後者の場合は、awkですべてを直接実行してください。その入力は実際には実際に有効なawkです(必要ならば有効なawkに操作できますが、より安全かもしれないawkによって解析されます)。これを断片的なシェル配列に分割しようとすると、問題が発生することがあります。 –

答えて

0

、次のようにあなたのコードを置き換える:

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

をFLATFILEが

age="24" 

あなたはできるようにフォーマットされたときそのファイルをソースしています。あなたがdb[n]を無視すると
、あなたは今、私たちは、各DBのファイルを分割したい

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

を使用し、各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 

さまざまなデータベースの変数には、小さな変更が必要です。

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 
関連する問題