我想用unix shell (ksh)写一个xml配置文件完整新检查脚本,主要原因:当一个xml配置文件内容过多的时候,很容易在修改过程中因为手误,增加或者误删了一个尖括号<, >," 等其他的符号,导致整个配置文件在运行过程中是非法的。
目的:在需要时候,可以用例如:check.sh gateway02.xml 检查一个文件的语句合法性。
或者在文件很多的时候,使用check.sh /config/xml/ 来检查/config/xml/下面众多xml文件的语句合法性。
我个人思路:针对每个文件,先将内容按照参数模块分割,并重定向到不同的临时文件中,然后对临时文件分别做检查处理。
分割文件内容模块到子文件中的过程:
#! /bin/sh
arr_tags="ROOT X_DEFINE CPC SGC ENUM_GROUP WILD_GROUP SRVDDR CLTDDR TCL TPP" #关键模块标签
cat $1 | sed -e '/^$/d' > config.tmp
cat config.tmp | awk –F'[<>]' '{
if(NF=3 && $1==$3 && $3=="")
{
if($2=="X_DEFINE")
{
tag=$2
echo $line >>$tag.tmp #将模块对应的行内容全部重定向到对应模块标签名的临时文件中
}
else if($2=="TPP")
{
tag=$2
echo $line >>$tag.tmp
}
else if($2=="/X_DEFINE")
{
tag=$2
echo $line >>$tag.tmp
}
else if($2=="/TPP")
{
tag=$2
echo $line >>$tag.tmp
}
else
{
str=substr("$2",1,3)
if("!--"==$str) #处理注释行,被忽略,最好能全部注释行重定向到特定文件,以便检查格式<!-- -->
continue
else if($tag != "")
echo $line >> $tag.tmp
else
continue
}
}'
针对每个临时文件中模块内容的检查:
#! /bin/sh
if [ -e "$myfile" ]
then
cat myfile | awk -F'[<>]' '{
if(NF==3)
{
if($2=="SRVDDR")
printf("开始检查:%s \n",$2);
else if($2=="/SRVDDR")
printf("完成检查:%s\n",$2);
}
else if(NF==5)
{
if($4=="/"$2)
{
if($2=="RouterType")
printf("检测到:%s \n",$2);
else if($2=="/RouterType")
printf("检测到:%s \n",$2);
else
{
printf("警告-未知参数项:%s \n",$2);
continue;
}
}else{
printf("警告:参数内容配置格式。\n%s\n",$line);
exit -1;
}
}else{
printf("警告:参数内容配置格式。\n%s\n",$line);
exit -1;
}
}'
遇到的问题:
① 数组在awk内外定义和使用;
② 逐行读取文件,鉴定标签为配置块标签之后,将两个<tag> </tag>
<tag...>
</tag>等结构之间的整行内容都返回到tag.tmp文件中做独立处理。
③想同时实现单个文件,或者某个文件夹下全部文件检查。
说明:
① arr_tags 是个数组,里面存放的是所有子模块的名称,在使用尖括号和空格分隔后,如果是唯一,且是数组成员将会被赋予给tag变量,形成tag.tmp 临时文件名称,以便存储对应模块的内容,做后续检查。
② ROOT 是个整个根节点标签,这里可以不做处理。
③ 每个子模块中都可能随时增加或者删减不同的配置参数,是否可以在其中使用数组实现灵活检查。
④ 配置文件如图片1,2,3,4,5,6,7顺序所示。
十分感谢大家关注和帮助,期盼高手老师能帮忙解答,谢谢!