Linux Shell | 解析xml节点
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'
Linux Shell | 解析xml节点的更多相关文章
- 解析xml节点属性及子节点内容
xml样例 <microNearlyThreeYearsOverdueInfo subReportType="13204" subReportTypeCost="9 ...
- java解析xml的三种方法
java解析XML的三种方法 1.SAX事件解析 package com.wzh.sax; import org.xml.sax.Attributes; import org.xml.sax.SAXE ...
- Java解析XML三种常用方法
1.使用DOM方式解析: package com.wzh.dom; import java.util.Iterator; import javax.xml.parsers.DocumentBuilde ...
- 记一次解析XML转对象的笔记
项目中调用第三方API,返回格式是XML字符串,需要将XML反序列化为对象,格式如下: <?xml version="1.0"?> <Response xmlns ...
- [C#]记一次解析XML转对象的笔记
项目中调用第三方API,返回格式是XML字符串,需要将XML反序列化为对象,格式如下: <?xml version="1.0"?> <Response xmlns ...
- 基于tiny4412的Linux内核移植 --- aliases节点解析
作者信息 作者: 彭东林 邮箱:pengdonglin137@163.com QQ:405728433 平台简介 开发板:tiny4412ADK + S700 + 4GB Flash 要移植的内核版本 ...
- 使用jQuery解析xml时command节点解析失败
jQuery版本1.8.3 待解析的xml为: <message><user><command>Login</command></message& ...
- C# 解析带前缀的Xml节点内容
一般的xml文件相信大家都会解析了,但是遇到有命名空间的带前缀的xml,对于新手可能会有点问题.我这里在论坛解答的时候就遇到过一题,见怎么获取XML节点里面的内容,在线求教.这里给大家演示一下. 他的 ...
- js 解析XML 在Edge浏览器下面 无法准确读到节点属性值
js 解析XML 在Edge浏览器下面 无法准确读到节点属性值 Dom.documentElement.childNodes[j].attributes[2] 这个是大众写法 在win10的edge ...
随机推荐
- 设置Linux支持中文
1.首先在command输入locale,可以看到Linux下默认的系统语言的是英文 2.vim ~/.bashrc打开这个文件,该文件夹相当于系统配置文件 3.打开后,将后三行命令输入到文档中,最后 ...
- SQL注入靶场sqli-labs 1-65关全部通关教程
以前说好复习一遍 结果复习到10关就没继续了 真是废物 一点简单的事做不好 继续把以前有头没尾的事做完 以下为Sqli-lab的靶场全部通关答案 目录: less1-less10 less10-les ...
- shark恒破解笔记6-摆脱NAG
1.打开软件后,发现是未注册,然后点击关闭按钮,会弹出窗口 我们的目的就是为了能够去掉这个弹窗. 2.对这个程序进行查壳,没有什么发现 3.载入OD里面,F9运行起来,随后切换到程序主界面点击关闭按钮 ...
- css div 自适应内容
.adapt-content{ display:inline-block; *display:inline; ; } 见:http://www.cnblogs.com/refe/p/5051661.h ...
- PHP each
1.函数的作用:遍历数组元素 2.函数参数: @params array &$array 3.例子: <?php $arr = ['Boy','Girl']; while(list($k ...
- [JZOJ5455]【NOIP2017提高A组冲刺11.6】拆网线
Description 企鹅国的网吧们之间由网线互相连接,形成一棵树的结构.现在由于冬天到了,供暖部门缺少燃料,于是他们决定去拆一些网线来做燃料.但是现在有K只企鹅要上网和别人联机游戏,所以他们需要把 ...
- Win10系统Cortana 小娜无法搜索
1.在开始菜单中找“Windows PowerShell”文件夹,打开后右键单击Windows PowerShell,选择“以管理员身份运行” 2.输入命令,通过重新注册语音小娜来解决问题 Get-A ...
- 关于a标签的href属性
今天有人问起我a标签的href属性值为 # 与 JavaScript:void(0) 有啥区别,想来也没啥可说,就简单说两句 a标签的href属性,优点有: 天然鼠标手型,以及可以被键盘focus以及 ...
- Vue 上传材料并传给后端接口(使用input)
最近工作中接到一个需求,需要上传一个文件材料,提交时传给后端.使用的框架是Vue,废话不说直接上代码 <template> <div> <input type=" ...
- ThinkPHP<6.0 SQL注入代码审计分析
版本过多只分析大版本和使用人数较多的版本目前使用人数最多的3.2.3.审计时也是发现多个版本未公开漏洞 测试环境: Mysql5.6/PHP5.5 首先明确的是在不使用PDO做参数绑定时ThinkP ...
