Bash 从xml文件中提取特定块
复杂的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
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