Bash AWK:从一行中包含html的输出中提取2个html标记之间的值

Bash AWK:从一行中包含html的输出中提取2个html标记之间的值,bash,awk,Bash,Awk,我有一个html输出,这是所有在一行;我曾尝试使用awk提取序列号,但由于一些奇怪的原因,我只得到一个输出。curl的输出是xml格式的 curl -sSku user:somepass https://somewebsite.com/computergroups/id/4 -X GET | awk 'BEGIN{IGNORECASE=1;FS="<serial_number>|</serial_number>";RS=EOF} {print $2}' 上面的命令只打印

我有一个html输出,这是所有在一行;我曾尝试使用awk提取序列号,但由于一些奇怪的原因,我只得到一个输出。curl的输出是xml格式的

curl -sSku user:somepass https://somewebsite.com/computergroups/id/4
-X GET | awk 'BEGIN{IGNORECASE=1;FS="<serial_number>|</serial_number>";RS=EOF} {print $2}'

上面的命令只打印第一次出现并在那里结束。它的打印量应该超过几百张。

Awk将是一个脆弱的解决方案,即如果输出XML发生变化,将来可能会失败

如果你想只做这一次,使用rs将每个标签敲到自己的一行上,然后用正则表达式在awk中拾取碎片

$ echo '<serialnumber>098456</serialnumber><serialnumber>095444></serialnumber>' | rs -c\> 0 1
<serialnumber
098456</serialnumber
<serialnumber
095444

不要让任何人忽视awk的力量,科雷姆

我生成了一些这样的测试数据。

如果你有呆呆的话


假设打开标记在关闭标记之前。

使用理解XML的东西来解析XML,而不是awk。感谢您的建议Shawn,我特别希望使用awk。它只读取一条记录,所以只有一个$2参数要打印。也许我们应该这么做。然后你就可以打印$NF了,这几百个都在同一行吗?如果是这样,您将不得不在awk中使用for循环遍历该记录中的每一列,并打印出每一个偶数列。我同意用awk做这件事有点像用锤子织毛衣。我设法找到了一个有用的工具:所以我先格式化它,使它不在一行中,然后用awk:…|xmllint-format-|awk-F[]'/serial_number/{print$3}'谢谢Ken,这正是我想要的。你应该提到的是,对于多字符和IGNORECASE,需要GNU awk。你是对的,但是在我出现之前,这些数据将保持静态:DYup,这是使用gawk的方法。
for n in {101..107}; do echo -n "a b c <serial_number>$n</serial_number>"; done > data
cat data | awk -- 'BEGIN{IGNORECASE=1;FS=">";RS="</serial_number"};/<serial/{print $NF}'
101
102
103
104
105
106
107
$ ... | awk -v RS='</?serial_number>' '!(NR%2)'