shell之实战应用一(查找xml文档中的关键字段)

 

前几天同事问我一个问题,说如下的文档中,如何把name后面的字段(红色框中的字段)单独打印出来?

 

其实这个很简单,先用sed过滤,然后用cut分割显示即可实现,如下:

sed -n '/name/p' a.xml | cut -d '"' -f 2

 使用sed命令的name匹配(或者field也可以)行,然后用cut把"作为分割符取第2列即可

 

或者使用awk也可以实现:

awk -F '"' '$0~"name"{print $2}' a.xml
#或者
awk 'BEGIN{FS="\""}$0~"name"{print $2}' a.xml

 上面语句是把界定符放在了外面,使用参数标识

下面语句是把界定符放在了语句里面,因为双引号是特殊字符,所以使用反斜杠转义一下

 

但我同事说,这个可不止只有一条数据,如果是多条数据,会重复打印字段,部分数据如下:

这时我们需要对语句进行稍微的加工,如果使用sed,则需要如下操作:

sed -n '/name/p' b.xml | cut -d '"' -f 2 | sort |uniq

 后面多加了俩个命令sort和uniq,sort是排序,uniq是去重,只有排序了才能去重,否则不生效。这里也可以把sort和uniq直接写成sort -u,当然如果需要反序,可以写成sort -ur

 

当然使用awk也是可以的,写成如下:

awk 'BEGIN{FS="\""}nameflag[$2]==$2{next}$0~"name"{print $2;nameflag[$2]=$2}' b.xml

 我们这里加了一个数列来存储第二个字段,然后来比较第二个字段是否再出现,如果出现就跳过执行后面的行,这样就避免了重复

 

大家有什么更好的解决办法可以留言!

 

posted @ 2018-07-15 00:23  水里的芋头  阅读(493)  评论(0编辑  收藏  举报