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=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