shell对xml文件操作(更新属性值+以当前日期重命名)

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!"

代码中的几个关键点

  1. shell的模糊匹配 * ls /home/perf/perf_files/models/Crm运行信息_*.xml
  2. 更改xml属性值 grepawk RLSuccSum=(cat&quot;(cat &quot;CrmFile" | grep “” |awk -F “>” ‘{print $2}’ |awk -F “<” ‘{print $1}’)
  3. 直接修改读取的文件内容 sed -i sed -i “/原字符串/c \新字符串” 文件路径
  4. cut -b 是以字节分割,其中中文字符占4个字节,英文字符占1个字节
  5. 字符串变量分割: ${CurTime:0:8}
  6. 给各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

梦想还是要有的,万一实现了呢~ヾ(◍°∇°◍)ノ゙~~~~~~~~
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章