2016-04-05 54 views
3

我有一些數據存儲在一個平面文件中,類似於下面顯示的數據。我需要能夠將數據提取到變量中,例如變量AGE等於24,變量用戶等於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來提取括號中的文本,並將該數據放入數組中。

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

然後我就用databaseCount找到weach陣列的數據計劃,所以我想知道,在年齡數組的元素0找到的數據是數據庫0和元素中找到的數據1 ofr數據庫1.

我遇到的問題是在語音標記之間找到的一些文本有空格。

echo ${office[0]} 

將返回「英國」,而不是「英國辦公室2」。

有誰知道如何解決這個問題,或者如果有更好的方法來提取數據?

謝謝。

+0

你有一個現有的bash腳本需要這些數據?或者,你是否只是試圖處理一些還沒有寫的腳本?如果後者則直接在awk中完成。這個輸入實際上是awk已經實際上有效的(如果需要,可以將其操作爲有效的awk,或者通過awk解析,這可能更「安全」)。試圖將此分解成殼體陣列是在尋求麻煩。 –

回答

0

如果您訪問方式,您應該封裝的元素在雙引號的陣列,替換爲以下代碼:

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

當FLATFILE格式化像

age="24" 

你可以已經找到該文件。
當你忽略了db[n],您可以使用

. <(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