我有一些数据存储在一个平面文件中,类似于下面显示的数据。我需要能够将数据提取到变量中,例如变量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”。
有没有人知道如何解决这个问题,或者是否有更好的方法来提取数据?
谢谢。
答案 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