我需要从下面的shell示例文件中的xml文件中grep值:test.xml
<wtc-import>
<name>WTCImportedService-288-rap04</name>
<resource-name>CAC040F</resource-name>
<local-access-point>lap01</local-access-point>
<remote-access-point-list>rap04</remote-access-point-list>
<remote-name>CAC040F</remote-name>
</wtc-import>
<wtc-import>
<name>WTCImportedService-289-rap04</name>
<resource-name>CAD040F</resource-name>
<local-access-point>lap01</local-access-point>
<remote-access-point-list>rap04</remote-access-point-list>
<remote-name>CAD040F</remote-name>
</wtc-import>
<wtc-import>
<name>WTCImportedService-290-rap04</name>
<resource-name>CAE040F</resource-name>
<local-access-point>lap01</local-access-point>
<remote-access-point-list>rap04</remote-access-point-list>
<remote-name>CAE040F</remote-name>
</wtc-import>
<wtc-import>
<name>WTCImportedService-289-rap04</name>
<resource-name>CAD040F</resource-name>
<local-access-point>lap01</local-access-point>
<remote-access-point-list>rap04</remote-access-point-list>
<remote-name>CAD040F</remote-name>
</wtc-import>
必须grep与he文件中关联的所有值,最后如果存在任何重复的资源名称,则从输出文件中删除重复的值
预期产量:
CAC040F
CAD040F
CAE040F
资源CAD040F是重复的,因此在预期的输出中它只出现一次
尝试:
grep 'resource-name' test.xml | awk -F">" '{print $2}' | awk -F"<" '{print $1}'
这是有效的..在此之后过滤重复的方式?
您可以使用单个awk命令执行此操作
awk -F"[<>]" '/resource-name/ && !seen[$3]++ { print $3 } ' test.xml
使用您的示例xml文件
$ awk -F"[<>]" '/resource-name/ && !seen[$3]++ { print $3 } ' test.xml
CAC040F
CAD040F
CAE040F
$
只是速度优化与已经完成工作的@ stack0114106相比
awk -F '[<>]' '$2 == "resource-name" && ! ( $3 in List) { print $3; List[$3] } ' test.xml
如果您已经获得了输出并且只是想要删除重复项,那么最简单的方法是将输出管道排序然后再进行uniq,这样您的命令就会像这样
grep 'resource-name' test.xml | awk -F">" '{print $2}' | awk -F"<" '{print $1}' | sort | uniq
如果您选择使用bash正则表达式,请尝试以下操作:
declare -A name
regex="<remote-name>([^<]+)</remote-name>"
while read -r line; do
if [[ $line =~ $regex ]]; then
name["${BASH_REMATCH[1]}"]=1
fi
done < "test.xml"
for i in "${!name[@]}"; do
echo "$i"
done