2016-04-05 50 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