如何用yq解析XML并无需指定索引提取服务器名称
无需指定索引提取XML中的服务器名称(yq及其他工具方案)
问题场景
我需要解析Oracle WebLogic的config.xml文件提取所有服务器名称,但当前使用yq时必须指定每个服务器的索引才能获取对应名称,希望找到无需指定索引即可批量提取的方法。
当前执行的命令及输出:
cat /home/hakim/Oracle/Middleware/Oracle_Home/user_projects/domains/base_domain/original/config.xml | yq -p=xml .domain.server
输出结果:
- name: AdminServer ssl: name: AdminServer listen-port: "7002" listen-address: - name: Server_1 machine: Machine_1 listen-port: "7003" cluster: Cluster_1 listen-address: jta-migratable-target: user-preferred-server: Server_1 cluster: Cluster_1 - name: Server_2 machine: Machine_1 listen-port: "7004" cluster: Cluster_1 listen-address: jta-migratable-target: user-preferred-server: Server_2 cluster: Cluster_1 - name: Server_3 machine: Machine_1 listen-port: "7005" cluster: Cluster_1 listen-address: jta-migratable-target: user-preferred-server: Server_3 cluster: Cluster_1
解决方案
1. 使用yq批量提取所有服务器名称
利用yq的数组遍历语法[],直接遍历所有server元素并提取name字段,无需指定索引:
yq -p=xml '.domain.server[].name' /home/hakim/Oracle/Middleware/Oracle_Home/user_projects/domains/base_domain/original/config.xml
输出示例:
AdminServer Server_1 Server_2 Server_3
如果需要输出纯字符串(不带引号),添加-r参数:
yq -r -p=xml '.domain.server[].name' /home/hakim/Oracle/Middleware/Oracle_Home/user_projects/domains/base_domain/original/config.xml
2. 使用xmllint(原生XML处理工具)
如果系统预装了xmllint,可以直接用XPath查询原生XML,无需转成YAML格式:
xmllint --xpath '//domain/server/name/text()' /home/hakim/Oracle/Middleware/Oracle_Home/user_projects/domains/base_domain/original/config.xml
若需要换行分隔每个名称,可搭配grep处理:
xmllint --format --xpath '//domain/server/name' /home/hakim/Oracle/Middleware/Oracle_Home/user_projects/domains/base_domain/original/config.xml | grep -oP '(?<=<name>).*(?=</name>)'
内容的提问来源于stack exchange,提问作者Hakim OUBOUALI
相关产品推荐
相关产品推荐

