【问题标题】:Awk search for a specific field in an XML fileawk 在 XML 文件中搜索特定字段
【发布时间】:2016-02-08 19:11:29
【问题描述】:

我在 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 文件。)

有什么想法吗?

谢谢!

【问题讨论】:

  • 可能第一个 XML 和 .conf 文件中的行分隔符不一样。
  • 试试看这个文件是否包含一些奇怪的东西或者它来自一个 DOS 系统。你可以cat -vet它并检查奇怪的字符。
  • @fedorqui cat -vet 在每行末尾显示 $ 特殊字符。然而(奇怪的是)$ 也出现在分隔每个段落的行中的 2 个空格。这是标准行为吗?
  • @fedorqui - 我编辑了 .conf 文件以删除段落分隔行中的那些额外空格,并且 awk 现在可以正常运行搜索了!谢谢你的帮助! PS。您可以将您的建议添加为官方答案,以便我接受并投票。
  • 很高兴看到它已解决,@Cain !刚刚发布了一个带有一些解释的答案。

标签: xml apache search awk


【解决方案1】:

您在这些段落之间有一些带有尾随空格的行。因此,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

$ 是行尾,$ 表示有两个空格。

【讨论】:

  • 感谢您的详尽解释和努力,@fedorqui。这太棒了!
猜你喜欢
  • 2016-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-06
  • 1970-01-01
相关资源
最近更新 更多