01 xml文件

# user.xml
<user>
<name>Toy</name>
<sex>man</sex>
<room/>
</user>

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


02 多条命令解析xml节点

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

[~]$ cat user.xml | grep name | sed 's/^.*<name>//g' | sed 's/<\/name>.*$//g'
Toy
[~]$ cat user.xml | grep name | sed 's/^.*<sex>//g' | sed 's/<\/sex>.*$//g' [~]$ cat user.xml | grep room | sed 's/^.*<room>//g' | sed 's/<\/room>.*$//g'
<room/>

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

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


03 一行 awk 命令解析xml节点

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

[~]$ awk  '/<\/*name\/*>/{gsub(/[[:space:]]*<\/*name\/*>/,"");print $0}' user.xml
Toy
[~]$ awk '/<\/*sex\/*>/{gsub(/[[:space:]]*<\/*sex\/*>/,"");print $0}' user.xml
man
[~]$ awk '/<\/*room\/*>/{gsub(/[[:space:]]*<\/*room\/*>/,"");print $0}' user.xml [~]$

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

简单说明下命令的意思:

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

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

  • </*name/*> 中的 * 号是正则表达式,* 号表示可以重复前面字符 0 个或多个,所以 </*name/*> 可以间接的表示<name></name><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}' <xml文件>
可以替代
cat <xml文件> | grep "匹配的字符串" | sed 's/匹配的字符串/""/g'

最新文章

  1. 异步控制---实现函数asyncAll,在执行完传入数组中func1,func2,func3异步函数后,输出“end”
  2. 基于MVC4+EasyUI的Web开发框架经验总结(2)- 使用EasyUI的树控件构建Web界面
  3. 50行代码仿backbone_todos
  4. Hadoop Hello World
  5. CentOS 7 安装无线驱动
  6. PHP中使用Luhn算法校验信用卡及借记卡卡号
  7. inferred 和 freefrom
  8. Code repo
  9. GPUImage库的使用
  10. 2017-07-07(zip unzip gzip gunzip)
  11. Linux 环境 Java JDK 安装&amp;基本配置
  12. VS2015 IIS Express 无法启动 解决办法
  13. jquery.pjax 单页面, 无刷新打开页面.
  14. BZOJ2553[BeiJing2011]禁忌——AC自动机+概率DP+矩阵乘法
  15. kernel_thread简析
  16. 模拟a标签click,弹出新页面
  17. 批量拼脚本神器-NimbleText
  18. 如何解决VMware 虚拟机不能铺满屏幕
  19. [leetcode]211. Add and Search Word - Data structure design添加查找单词 - 数据结构设计
  20. 微信小程序:scroll-view的bug

热门文章

  1. 从0开始学FreeRTOS-(消息队列)-5
  2. Feign【文件上传】
  3. 04-09 XgBoost算法
  4. python基本数据类型及常用功能
  5. UWP开发入门(二十四)—— Win10风格的打印对话框
  6. python编程基础之三十八
  7. SQL server数据库系统部分常用的存储过程及说明
  8. drf框架接口文档
  9. Redis原理篇
  10. Flink Connector 深度解析