将文本从平面文件读入变量

时间:2016-04-05 13:43:18

标签: linux bash

我有一些数据存储在一个平面文件中,类似于下面显示的数据。我需要能够将数据提取到变量中,例如变量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来提取括号中的文本并将数据放入数组中。

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

然后我计划使用databaseCount来查找weach数组的数据,所以我知道在age数组的元素0中找到的数据是用于数据库0而在元素1中找到的数据是数据库1。

我遇到的问题是在语音标记之间找到的一些文字有空格。

echo ${office[0]} 

将返回“uk”而不是“uk office 2”。

有没有人知道如何解决这个问题,或者是否有更好的方法来提取数据?

谢谢。

2 个答案:

答案 0 :(得分:0)

如果以这种方式访问​​数组,则应将元素封装在双引号中,用以下代码替换代码:

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

答案 1 :(得分:0)

当flatFile格式化为

age="24"

你可以找到该文件。
忽略db[n]时,可以使用

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

现在我们要为每个数据库拆分文件并处理每个数据库的行:

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