我在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文件。)
任何想法为什么?
谢谢!
答案 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
使用$
,您会看到行尾,因为您看到$
,这意味着有两个空格。