在Linux下使用awk解析ini文件的方法
·
[tommwq@126.com]
ini文件
ini文件是一些软件用来保存配置信息的文本文件。ini文件的优点是简单和灵活,缺点是没有统一的标准。
下面来看一个ini文件内容示例:
[Master]
Arguments = -log master.log
LogLevel = 3
[Client]
Arguments = -log client.log
LogLevel = 1
从这里可以看到,ini文件的内容可以根据[Master]、[Client]分为不同的部分,每个部分包含了一组键值对。我们可以对ini文件进行简单的建模:
- ini文件是一个文本文件,由一组域组成。
- 域由域名字和一系列键值对组成。域名字和每个键值对,分别占一行。
- 域名所在行的格式为“[域名字]”。
- 域中键值对所在行的格式为“键=值”。
基于这个模型就可以对ini文件进行解析。
awk程序
下面的程序遍历ini文件的每一行,将读取到的键值对以 “export scope_name=value”
的格式输出。
# ini2env.awk
function ltrim(s) { sub(/^[ \t\r\n]+/, "", s); return s }
function rtrim(s) { sub(/[ \t\r\n]+$/, "", s); return s }
function trim(s) { return rtrim(ltrim(s)); }
BEGIN{scope="";} {
if ($1 ~ /\[.*\]/)
scope=trim(substr($1,2,length($1)-2));
else {
name=trim($1)
value=$2;
if (length(value) > 0) {
printf("export %s_%s=\"%s\"\n", scope, name, value);
}
}
}
使用示例
# ini 文件
[app]
arguments= --debug
# 将ini文件转换为临时的shell脚本。
tmpfile=`mktemp'
cat app.ini | awk -F '=' -f ini2env.awk >> $tmpfile
# 加载sh脚本,设置环境变量。
source $tmpfile
# 删除临时脚本。
rm $tmpfile
# 启动程序,将ini参数传入。
app=./a.out
$app $app_arguments
ini转换properties
类似的,可以将ini文件转换为properties文件。
function ltrim(s) { sub(/^[ \t\r\n]+/, "", s); return s }
function rtrim(s) { sub(/[ \t\r\n]+$/, "", s); return s }
function trim(s) { return rtrim(ltrim(s)); }
BEGIN{scope="";} {
if ($1 ~ /\[.*\]/)
scope=substr($1,2,length($1)-2);
else {
name=(scope "" "." trim($1));
value=$2;
if (length(value) > 0) {
printf("%s=\"%s\"\n", name, value);
}
}
}
修订记录
- 2019年09月27日 增加ini转换properties部分。