如何利用Shell脚本解析XML文件中标记之内的值?

我有一个XML文件包含若干图片中重复的代码段,我想将标记中的值提取出来排列成一定的格式,比如下面这种(以tab分隔):#hostoidgroupcommdesc192.1... 我有一个XML文件包含若干图片中重复的代码段,我想将标记中的值提取出来排列成一定的格式,比如下面这种(以tab分隔):
#host oidgroup comm desc
192.168.1.1 CpuUtilization_MF public 192.168.1.1_CPUUtilizaton
192.168.1.2 CpuUtilization_MF public 192.168.1.2_CPUUtilizaton
192.168.1.3 CpuUtilization_MF public 192.168.1.3_CPUUtilizaton
192.168.1.4 CpuUtilization_MF public 192.168.1.4_CPUUtilizaton
192.168.1.5 CpuUtilization_MF public 192.168.1.5_CPUUtilizaton
能看见图片了么?
展开
 我来答
小米飞猫
2012-01-06 · 专注于IT监控领域技术
小米飞猫
采纳数:1653 获赞数:4811

向TA提问 私信TA
展开全部
$cat test.sh
#!/bin/bash
if [ -z $1 ];then
echo 'USAGE:COMMAND FILENAME'
exit 0
fi
filename=record.txt
HOST=(`sed -n 's/.*>\(.*\)<\/host>/\1/p' $1`)
OIDG=(`sed -n 's/.*>\(.*\)<\/oidgroupname>/\1/p' $1`)
COMM=(`sed -n 's/.*>\(.*\)<\/communitystring>/\1/p' $1`)
DESC=(`sed -n 's/.*>\(.*\)<\/description>/\1/p' $1`)
FILE=(`ls -l $filename >/dev/null 2>&1 | awk '{print $8}'`)
if [ ! -z $FILE ];then
echo -e "host\t\toidgroupname\t\tcomm\t\tdesc" >$filename
fi
for((i=0;i<${#HOST[@]};i++));do
echo -e "${HOST[i]}\t${OIDG[i]}\t${COMM[i]}\t\t${DESC[i]}" >>$filename
done

$./test.sh file
$cat record.txt
host oidgroupname comm desc
192.168.1.1 CpuUtilization_MF public 192.168.1.1_CPUUtilizaton
192.168.1.2 CpuUtilization_MF public 192.168.1.2_CPUUtilizaton
192.168.1.3 CpuUtilization_MF public 192.168.1.3_CPUUtilizaton
192.168.1.4 CpuUtilization_MF public 192.168.1.4_CPUUtilizaton
192.168.1.5 CpuUtilization_MF public 192.168.1.5_CPUUtilizaton
更多追问追答
追问
首先谢谢你的解答,非常感谢您!
不过我有几个地方不太明白,问题如下:
1.FILE=(`ls -l $filename >/dev/null 2>&1 | awk '{print $8}'`) 这段是想实现什么呢?我去掉不影响输出结果。
2.for语句中的i<${#HOST[@]}是什么意思?
3.当某行记录中存在空格的时候,数组提取会出错,比如第100行内容为ICMP 192.168.1.1,那么我利用${DESC[99]}结果却为ICMP,这是为什么呢?
希望你能帮我解答,谢谢!
追答
1.FILE=(`ls -l $filename >/dev/null 2>&1 | awk '{print $8}'`) 这段是想实现什么呢?我去掉不影响输出结果。
##############################################
FILE=(`ls -l $filename >/dev/null 2>&1 | awk '{print $8}'`)
#这个是另一种判断文件是否存在的方式,跟下边那个功能一样。
if [ ! -z $FILE ];then
echo -e "host\t\toidgroupname\t\tcomm\t\tdesc" >$filename
fi
###############################################
上边这段可以全删掉,只留下边这段就可以了
if [ -f $filename ];then
echo -e "host\t\toidgroupname\t\tcomm\t\tdesc" >$filename
fi
#主要功能是判断追加数据的文件是否存在,不存在的话就重新创建一个,存在的话就继续追加。
2.for语句中的i<${#HOST[@]}是什么意思?
HOST这个数组中元素的个数
3.光听你用文字描述,我很难理解你所描述的情况,比如记录中存在空格,空格在记录中的什么位置,第100行ICMP这段是什么样的?。我只是按照图片里的格式写的。这个具体情况,还得具体分析。毕竟我不知道你xml整体是什么样的。
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式