Bash 从xml文件中提取特定块

Bash 从xml文件中提取特定块,bash,xml-parsing,Bash,Xml Parsing,复杂的bash解决方案: 有效的xml结构如下所示(例如rules.xml): 用法: #!/bin/bash ruleId=$2 getSum () { echo $(xmlstarlet sel -t -v "sum(//ruleId[text()=$2]/following-sibling::$3[1])" "$1") } mySum=$(getSum $1 $ruleId "myCount") hisSum=$(getSum $1 $ruleId "hisCount") to

复杂的bash解决方案:

有效的xml结构如下所示(例如
rules.xml
):

用法

#!/bin/bash
ruleId=$2

getSum () {
    echo $(xmlstarlet sel -t -v "sum(//ruleId[text()=$2]/following-sibling::$3[1])" "$1")
}

mySum=$(getSum $1 $ruleId "myCount")
hisSum=$(getSum $1 $ruleId "hisCount")
totalSum=$(getSum $1 $ruleId "totalCount")

printf "%-6s\t%-11s\t%-12s\t%-14s\n" "RuleID" "mycount-SUM" "hisCount-SUM" "totalCount-SUM" 
printf "%-6s\t%-11s\t%-12s\t%-14s\n" "$ruleId" "$mySum" "$hisSum" "$totalSum"
签名:
(全部必填)


输出:

bash rule_counts.sh rules.xml 1412

说明

#!/bin/bash
ruleId=$2

getSum () {
    echo $(xmlstarlet sel -t -v "sum(//ruleId[text()=$2]/following-sibling::$3[1])" "$1")
}

mySum=$(getSum $1 $ruleId "myCount")
hisSum=$(getSum $1 $ruleId "hisCount")
totalSum=$(getSum $1 $ruleId "totalCount")

printf "%-6s\t%-11s\t%-12s\t%-14s\n" "RuleID" "mycount-SUM" "hisCount-SUM" "totalCount-SUM" 
printf "%-6s\t%-11s\t%-12s\t%-14s\n" "$ruleId" "$mySum" "$hisSum" "$totalSum"
ruleId=$2
-指向传递给shell脚本的第二个命令行参数

“sum(//ruleId[text()=$2]/以下同级::$3[1])”
-xpath表达式,为参数节点集中传递的每个节点返回

对于
myCount
节点,它将是
“sum(//ruleId[text()=1412]/以下同级::myCount[1])”

以下同级轴包含上下文节点的所有以下同级

Complexbash+解决方案:

有效的xml结构如下所示(例如
rules.xml
):

用法

#!/bin/bash
ruleId=$2

getSum () {
    echo $(xmlstarlet sel -t -v "sum(//ruleId[text()=$2]/following-sibling::$3[1])" "$1")
}

mySum=$(getSum $1 $ruleId "myCount")
hisSum=$(getSum $1 $ruleId "hisCount")
totalSum=$(getSum $1 $ruleId "totalCount")

printf "%-6s\t%-11s\t%-12s\t%-14s\n" "RuleID" "mycount-SUM" "hisCount-SUM" "totalCount-SUM" 
printf "%-6s\t%-11s\t%-12s\t%-14s\n" "$ruleId" "$mySum" "$hisSum" "$totalSum"
签名:
(全部必填)


输出:

bash rule_counts.sh rules.xml 1412

说明

#!/bin/bash
ruleId=$2

getSum () {
    echo $(xmlstarlet sel -t -v "sum(//ruleId[text()=$2]/following-sibling::$3[1])" "$1")
}

mySum=$(getSum $1 $ruleId "myCount")
hisSum=$(getSum $1 $ruleId "hisCount")
totalSum=$(getSum $1 $ruleId "totalCount")

printf "%-6s\t%-11s\t%-12s\t%-14s\n" "RuleID" "mycount-SUM" "hisCount-SUM" "totalCount-SUM" 
printf "%-6s\t%-11s\t%-12s\t%-14s\n" "$ruleId" "$mySum" "$hisSum" "$totalSum"
ruleId=$2
-指向传递给shell脚本的第二个命令行参数

“sum(//ruleId[text()=$2]/以下同级::$3[1])”
-xpath表达式,为参数节点集中传递的每个节点返回

对于
myCount
节点,它将是
“sum(//ruleId[text()=1412]/以下同级::myCount[1])”


following同级
轴包含上下文节点的所有以下同级

您可以提供完整的
XML
根节点吗?使用
XML
parsersa有效的XML需要
root
element您能告诉我们您到目前为止尝试了什么吗?所以实际的XML不是这样的。我从中提取了规则ID,并使用grep awk和sort命令计算了最频繁的规则ID。但这并没有给我那个特殊的数的总和ruleId@Manoj:
grep
awk
不是最好的方法。当您说
xml解析
时,您需要使用更多的语法感知工具,如
xmllint
xmlstarlet
,这些工具需要根节点提供完整的
xml
。您可以为根节点提供完整的
xml
?使用
XML
parsersa有效的XML需要
root
element您能告诉我们您到目前为止尝试了什么吗?所以实际的XML不是这样的。我从中提取了规则ID,并使用grep awk和sort命令计算了最频繁的规则ID。但这并没有给我那个特殊的数的总和ruleId@Manoj:
grep
awk
不是最好的方法。当您说
xml解析
时,您需要使用更多语法感知工具,如
xmllint
xmlstarlet
,这些工具需要根节点提供完整的
xml