linux读取xml节点内容,Linux Shell | 解析xml节点的值

01 xml文件

# user.xml

Toy

man

其中第 5 行的 xml 节点是空节点,是比较特殊的格式。

02 多条命令解析xml节点

采用多条命令和管道符也可以解析xml节点,方式如下:

[~]$ cat user.xml | grep name | sed 's/^.*//g' | sed 's/.*$//g'

Toy

[~]$ cat user.xml | grep name | sed 's/^.*//g' | sed 's/.*$//g'

[~]$ cat user.xml | grep room | sed 's/^.*//g' | sed 's/.*$//g'

上面的方式无法解析 这种特殊格式的 xml 节点,虽然用多个命令和管道符是可以实现解析正常格式的xml节点的值,但是过多的管道符是会降低执行效率的。

因为管道符是会为连接的命令产生子进程,从而加大CPU的开销。

03 一行 awk 命令解析xml节点

awk 命令解析所有特殊的 xml 节点的值,只需要一行命:

[~]$ awk '//{gsub(/[[:space:]]*/,"");print $0}' user.xml

Toy

[~]$ awk '//{gsub(/[[:space:]]*/,"");print $0}' user.xml

man

[~]$ awk '//{gsub(/[[:space:]]*/,"");print $0}' user.xml

[~]$

上面的 awk 方式可以兼容所有特殊的 xml 节点,并且只需要一条命令就能解析出 xml 的值。

简单说明下命令的意思:

awk '/匹配的字符串/{print $0}'表示在文本中,找到匹配的字符串所在的行记录,可以替代grep "匹配的字符串"

gsub(/匹配的字符串/,"")是 awk 内部的函数,表示将匹配到的字符串替换成"",也就是替换成空字符串,可以替代 sed 's/匹配的字符串//g'

*name/*> 中的 * 号是正则表达式,*号表示可以重复前面字符 0 个或多个,所以*name/*> 可以间接的表示、 和等

[[:space:]] 表示匹配空格、制表格等空白符,[[:space:]]*表示匹配空白字符0个或多个

$0 表示取记录的所有记录

所以,awk 解析 xml 节点的命令小结成如下:

awk '//{gsub(/[[:space:]]*/,"");print $0}' xml文件

04 小结

我们在编写脚本时,需要解析文本文件时,尽量避免使用多命令和管道符的方式去解析,因为使用了管道符就会产生子进程,会加大了 CPU 的开销。

大部分情况下只需要一条 awk 命令就完成解析的工作,相比较起多命令和管道符的方式效率会更高,并且CPU开销小。

通过以上的两个解析xml节点的案例,我们可以总结出:

awk '/匹配的字符串/{print $0}' 可以替代 grep "匹配的字符串"

awk '{gsub(/匹配的字符串/,"");print $0}' 可以替代 sed 's/匹配的字符串/""/g'

awk '/匹配的字符串/{gsub(/匹配的字符串/,"");print $0}'

可以替代

cat | grep "匹配的字符串" | sed 's/匹配的字符串/""/g'

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值