awk搜索XML文件中的特定字段

时间:2015-11-07 19:57:46

标签: xml apache search awk

我在Ubuntu 14.04服务器上有一个名为vsearch.awk的awk控制文件,它包含两行简单的代码,如下所示:

BEGIN { RS="\n\n" ; }
$0 ~ search { print }

我从命令行运行此文件以搜索XML文件中的特定字段,如下所示:

awk -f vsearch.awk search=example stuff.xml

它打印出我需要的确切字段(包含单词“ example ”)。 但是,当我在Apache主机.conf文件(也似乎是XML格式)上运行它时,awk只会吐出整个文件。 我使用了gawk和mawk,结果相同(两者都适用于常规XML文件,但不适用于.conf文件。)

任何想法为什么?

谢谢!

1 个答案:

答案 0 :(得分:0)

在这些段落之间有一些带有尾随空格的行。因此,awk认为两个不同的段落相同,因为它们没有被集合RS=\n\n分隔,而是由\n \n之类的东西分隔。

注意我建议说cat -vet <file>,因为通过这种方式,您可以看到所有尾随空格,制表符和行尾。

来自man cat

   -e     equivalent to -vE

   -E, --show-ends
          display $ at end of each line

   -t     equivalent to -vT

   -T, --show-tabs
          display TAB characters as ^I

   -v, --show-nonprinting
          use ^ and M- notation, except for LFD and TAB

测试

让我们准备一个两段文件,但中间有空格而不是空行:

$ cat -vet a
hello$
$                  # two trailing spaces
how are you$

它只是“看到”一段:

$ awk 'BEGIN { RS="\n\n" ; } {print NF}' a
4

现在,如果我们删除这些尾随空格:

$ cat -vet a
hello$
$                    # no trailing spaces
how are you$

它“看到”两段:

$ awk 'BEGIN { RS="\n\n" ; } {print NF}' a
1
3

使用$,您会看到行尾,因为您看到$,这意味着有两个空格。