shell对xml文件操作(更新属性值+以当前日期重命名)
xml示例文件
本文代码将以下面文件名为Crm运行信息_20190222103001.xml 的文件为例做说明。
<?xml version="1.0" encoding="UTF-8"?>
<!-- Base_station_ICT -->
<CrmRunningInfoRecordList>
<CrmRunningInfoRecord>
<CRMNETUNIT>5</CRMNETUNIT>
<RLSETUPNUM>1633</RLSETUPNUM>
<JQRLSETUPNUM>2388</JQRLSETUPNUM>
<RLSETUPSUCCESSNUM>601</RLSETUPSUCCESSNUM>
<RLSETUPFAILNUM>1032</RLSETUPFAILNUM>
<JQRLSETUPSUCCESSNUM>1426</JQRLSETUPSUCCESSNUM>
<JQRLSETUPFAILNUM>962</JQRLSETUPFAILNUM>
<REPORTTIME>2019-01-10 14:30:01</REPORTTIME>
</CrmRunningInfoRecord>
</CrmRunningInfoRecordList>
该文件所属目录为 /home/perf/perf_files/models/
修改xml文件的shell脚本
#!/bin/sh
change_CRM_precent()
{
# 找出当前Crm运行信息_*.xml文件存放的绝对路径
# 【例】输出/home/perf/perf_files/models/CRM运行信息_20190222103001.xml
CrmFile=$(ls /home/perf/perf_files/models/Crm运行信息_*.xml)
# 读xml文件,对属性值做修改
# sed -i "/旧值/c \新值" 文件路径
RLSuccSum=$(cat "$CrmFile" | grep "<RLSETUPSUCCESSNUM>" |awk -F ">" '{print $2}' |awk -F "<" '{print $1}')
RLFailSum=$(cat "$CrmFile" | grep "<RLSETUPFAILNUM>" |awk -F ">" '{print $2}' |awk -F "<" '{print $1}')
RLSuccSumNew=$(($RLSuccSum + 1))
RLFailSumNew=$(($RLFailSum + 3))
RLSumNew=$(( $RLSuccSumNew + $RLFailSumNew ))
sed -i "/<RLSETUPNUM>/c \ <RLSETUPNUM>$RLSumNew</RLSETUPNUM>" $CrmFile
sed -i "/<RLSETUPSUCCESSNUM>/c \ <RLSETUPSUCCESSNUM>$RLSuccSumNew</RLSETUPSUCCESSNUM>" $CrmFile
sed -i "/<RLSETUPFAILNUM>/c \ <RLSETUPFAILNUM>$RLFailSumNew</RLSETUPFAILNUM>" $CrmFile
JQRLSuccSum=$(cat "$CrmFile" | grep "<JQRLSETUPSUCCESSNUM>" |awk -F ">" '{print $2}' |awk -F "<" '{print $1}')
JQRLFailSum=$(cat "$CrmFile" | grep "<JQRLSETUPFAILNUM>" |awk -F ">" '{print $2}' |awk -F "<" '{print $1}')
JQRLSuccSumNew=$(($JQRLSuccSum + 4))
JQRLFailSumNew=$(($JQRLFailSum + 2))
JQRLSumNew=$(( $JQRLSuccSumNew + $JQRLFailSumNew ))
sed -i "/<JQRLSETUPNUM>/c \ <JQRLSETUPNUM>$JQRLSumNew</JQRLSETUPNUM>" $CrmFile
sed -i "/<JQRLSETUPSUCCESSNUM>/c \ <JQRLSETUPSUCCESSNUM>$JQRLSuccSumNew</JQRLSETUPSUCCESSNUM>" $CrmFile
sed -i "/<JQRLSETUPFAILNUM>/c \ <JQRLSETUPFAILNUM>$JQRLFailSumNew</JQRLSETUPFAILNUM>" $CrmFile
CrmUnit=$(cat "$CrmFile" | grep "<CRMNETUNIT>" |awk -F ">" '{print $2}' |awk -F "<" '{print $1}')
CrmUnitNew=$(( ($CrmUnit + 1)%10 ))
if [ $CrmUnitNew -eq 0 ]; then
CrmUnitNew=10
fi
sed -i "/<CRMNETUNIT>/c \ <CRMNETUNIT>$CrmUnitNew</CRMNETUNIT>" $CrmFile
}
ModelPath=/home/perf/perf_files/models/
# ls ${ModelPath}DPU*.xml【输出】/home/perf/perf_files/models/DPU流量统计_20190222103001.xml
# 【说明】cut -b 是以字节分割,其中中文字符占4个字节,英文字符占1个字节
# 【输出】OldTime = 20190222103001
OldTime=$(ls ${ModelPath}DPU*.xml | cut -b 46-59)
# 【输出】CurTime = 20190222110447
CurTime=$(date "+%Y%m%d%H%M%S")
# 【输出】FilePath = 20190222 -- 以当前日期(年月日)命名新目录
FilePath=/home/perf/perf_files/${CurTime:0:8}/
if [ ! -d "$FilePath" ]; then
mkdir -p $FilePath
fi
# 执行shell自定义函数
change_CRM_precent
# 正则匹配项
# 4个字符是0-9的数字-2个字符是0-9的数字 2个字符是0-9的数字:2个字符是0-9的数字:2个字符是0-9的数字
RE="[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\} [0-9]\{2\}:[0-9]\{2\}:[0-9]\{2\}"
TT=$(date "+%Y-%m-%d %H:%M:%S")
# 给各xml按照日期尾缀命名
sed -i "s/$RE/$TT/g" ${ModelPath}*.xml
rename "$OldTime" "$CurTime" ${ModelPath}*.xml
cp ${ModelPath}*.xml $FilePath
echo "End ./change_models.sh to modify xml!"
代码中的几个关键点
- shell的模糊匹配 *: ls /home/perf/perf_files/models/Crm运行信息_*.xml
- 更改xml属性值 grep、awk: RLSuccSum= ( c a t " (cat " (cat"CrmFile" | grep “” |awk -F “>” ‘{print $2}’ |awk -F “<” ‘{print $1}’)
- 直接修改读取的文件内容 sed -i: sed -i “/原字符串/c \新字符串” 文件路径
- cut -b 是以字节分割,其中中文字符占4个字节,英文字符占1个字节
- 字符串变量分割: ${CurTime:0:8}
- 给各xml按照日期尾缀命名:
OldTime=$(ls ${ModelPath}DPU*.xml | cut -b 46-59)
CurTime=$(date "+%Y%m%d%H%M%S")
sed -i "s/$RE/$TT/g" ${ModelPath}*.xml
rename "$OldTime" "$CurTime" ${ModelPath}*.xml
cp ${ModelPath}*.xml $FilePath
梦想还是要有的,万一实现了呢~ヾ(◍°∇°◍)ノ゙~~~~~~~~