求助!unix shell脚本,检查xml配置文件完整性,急急急!感谢各位老师帮忙

连城叶 2017-05-14 10:11:42


我想用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顺序所示。

十分感谢大家关注和帮助,期盼高手老师能帮忙解答,谢谢!
...全文
1777 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
幽饮烛 2018-05-03
  • 打赏
  • 举报
回复
xmllint 命令既可以检查xml文件的完整性,又可以通过 xpath 获取需要的值
zxin1997 2018-05-02
  • 打赏
  • 举报
回复
python是什么都有三方库
连城叶 2017-05-16
  • 打赏
  • 举报
回复
我现在正在学shell脚本,所以想用这个实现。Python很简单吗?老是听说,但是没学过。
ckc 2017-05-15
  • 打赏
  • 举报
回复
用脚本做这个事情是事倍功半 用高级语言来做吧,python什么的就算从头学说不定都比你用shell脚本要快

2,161

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 UNIX文化
社区管理员
  • UNIX文化社区
  • 文天大人
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧