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
我们这里加了一个数列来存储第二个字段,然后来比较第二个字段是否再出现,如果出现就跳过执行后面的行,这样就避免了重复
大家有什么更好的解决办法可以留言!
关于本篇内容如有转载请注明出处;技术内容的探讨、纠错,请发邮件到70907583@qq.com