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

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