想要通过bash shell脚本编辑XML文件。 我一直在找一个解决方案 - 如果可以通过bash shell脚本解决这个问题,请分享你的建议。
输入文件(将存储在服务器中):
<?xml version="1.0" encoding="UTF-8"?>
<properties>
<directories installDir="/fs0/">
<directoriesInstance id="sharedDir" path=""/>
<directoriesInstance id="loaderInput" path="/fs0/share/iad/input"/>
<directoriesInstance id="loaderProcessing" path="/fs0/share/iad/processing"/>
<directoriesInstance id="loaderError" path="/fs0/share/iad/error"/>
<directoriesInstance id="loaderCompleted" path="/fs0/share/iad/completed"/>
</directories>
<applicationServerInstance id="app" serviceName="App Server" rmiPort="15001" jvmParameters="-Xmx3072m -Xms512m -XX:-UseGCOverheadLimit -XX:MaxPermSize=196m -Dsun.lang.ClassLoader.allowArraySyntax=true -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/fs0/clarity1/clarity/logs -Xloggc:/fs0/clarity1/clarity/logs/app_gc.log -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintHeapAtGC -Dcustom.properties=/fs0/share/custom.properties" maxThreads="1000" programParameters="" distributed="false" runJobScheduler="false" useSSO="true" maxConcurrentJobs="10" runProcessEngine="false" messageTimeToLive="120" messageReceiverInterval="5" exceptionRunInterval="normal" maxXmlNodesLimit="150000"/>
<applicationServer>
<applicationServerInstance id="app" serviceName=" App Server" rmiPort="15001" jvmParameters="-Xmx3072m -Xms512m -XX:-UseGCOverheadLimit -XX:MaxPermSize=196m -Dsun.lang.ClassLoader.allowArraySyntax=true -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/fs0/clarity1/clarity/logs -Xloggc:/fs0/clarity1/clarity/logs/app_gc.log -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintHeapAtGC -Dcustom.properties=/fs0/clarity1/share/custom.properties" maxThreads="1000" programParameters="" distributed="false" runJobScheduler="false" useSSO="true" maxConcurrentJobs="10" runProcessEngine="false" messageTimeToLive="120" messageReceiverInterval="5" exceptionRunInterval="normal" maxXmlNodesLimit="150000"/>
</applicationServer>
</properties>
在上面的代码片段中,我想搜索applicationServerInstance标签,看看它是否在jvmproperties标签中有Dcustom.properties = / fs0 / clarity1 / share / custom.properties - 如果它不存在我想添加到文件中保存文件。 所有都应该在bash shell脚本中。
我想将 -Dcustom.properties = / fs0 / share / custom.properties 值添加到 jvmParameters 属性 applicationServerInstance 标记中不存在。在上面的例子中它有这个值,但是如果它不存在我想要添加这个 -Dcustom.properties = / fs0 / share / custom.properties 值。
比如说我应该将 -Dcustom.properties = / fs0 / share / custom.properties 值添加到 jvmParameters 属性 applicationServerInstance 标记到以下代码段。
<applicationServerInstance id="app" serviceName=" App Server" rmiPort="15001" jvmParameters="-Xmx3072m -Xms512m -XX:-UseGCOverheadLimit -XX:MaxPermSize=196m -Dsun.lang.ClassLoader.allowArraySyntax=true -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/fs0/clarity1/clarity/logs -Xloggc:/fs0/clarity1/clarity/logs/app_gc.log -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintHeapAtGC " maxThreads="1000" programParameters="" distributed="false" runJobScheduler="false" useSSO="true" maxConcurrentJobs="10" runProcessEngine="false" messageTimeToLive="120" messageReceiverInterval="5" exceptionRunInterval="normal" maxXmlNodesLimit="150000"/>
答案 0 :(得分:0)
在XML文件中,第一个applicationServerInstance标记具有带-Dcustom.properties = / fs0 / share / custom.properties值的jvmParameters。但是在第二个applicationServerInstance标记中,jvmParameter具有-Dcustom.properties = / fs0 / clarity1 / share / custom.properties值而不是-Dcustom.properties = / fs0 / share / custom.properties。在这种情况下,我的代码片段再添加一个Dcustom.properties值。
所以第二个applicationServerInstance标签将是这样的。
<applicationServerInstance id="app" serviceName=" App Server" rmiPort="15001" jvmParameters="-Xmx3072m -Xms512m -XX:-UseGCOverheadLimit -XX:MaxPermSize=196m -Dsun.lang.ClassLoader.allowArraySyntax=true -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/fs0/clarity1/clarity/logs -Xloggc:/fs0/clarity1/clarity/logs/app_gc.log -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintHeapAtGC -Dcustom.properties=/fs0/clarity1/share/custom.properties -Dcustom.properties=/fs0/share/custom.properties" maxThreads="1000" programParameters="" distributed="false" runJobScheduler="false" useSSO="true" maxConcurrentJobs="10" runProcessEngine="false" messageTimeToLive="120" messageReceiverInterval="5" exceptionRunInterval="normal" maxXmlNodesLimit="150000"/>
Bash脚本:
#!/usr/bin/env bash
file_name="/home/selvam/Scripts/test.xml"
for i in $(grep -nE "<applicationServerInstance.*jvmParameters" $file_name | cut -d ':' -f1)
do
jvm_parameters=$(head -$i $file_name | tail -1 | awk -F '"' '{ for (c=1; c<=NF; c++) if ($c ~ /jvmParameters/) print $(c+1)}')
echo $jvm_parameters | grep -q 'Dcustom.properties=/fs0/share/custom.properties'
if ([ $? -ne 0 ]) then
jvm_new_parameters=$(echo $jvm_parameters -Dcustom.properties=/fs0/share/custom.properties)
sed -i "${i}s%jvmParameters=\"$jvm_parameters\"%jvmParameters=\"$jvm_new_parameters\"%" $file_name
fi
done
答案 1 :(得分:0)
<强> AWK 强>
awk -F"jvmParameters=" '{if((/applicationServerInstance/)&&($2!~/Dcustom.properties/)){sub("PrintHeapAtGC","PrintHeapAtGC -Dcustom.properties=/fs0/share/custom.properties")}print}' $inputfile
将是另一种解决方案。将$ inputfile替换为您要处理的文件的名称。