awk 模式可以匹配多行吗?

新手上路,请多包涵

我有一些复杂的日志文件,我需要编写一些工具来处理它们。我一直在玩 awk,但我不确定 awk 是否是正确的工具。

我的日志文件是 OSPF 协议解码的打印输出,其中包含各种协议 pkts 及其内容的文本日志,以及用它们的值标识的各种协议字段。我想处理这些文件并仅打印出与特定 pkts 相关的某些日志行。每个 pkt 日志可以包含该 pkt 条目的不同数量的行。

awk 似乎能够处理与模式匹配的单行。我可以找到所需的 pkt,但随后我需要匹配后面几行中的模式,以确定它是否是我要打印的 pkt。

另一种看待这个问题的方法是,我想隔离日志文件中的几行,并根据多行上的模式匹配打印出作为特定 pkt 详细信息的那些行。

由于 awk 似乎是基于行的,我不确定这是否是最好的工具。

如果awk可以做到这一点,它是如何做到的?如果没有,关于使用哪种工具的任何建议?

原文由 Andres Gonzalez 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 809
2 个回答

awk 可以轻松检测模式的多行组合,但您需要在代码中创建所谓的 _状态机_ 来识别序列。

考虑这个输入:

 how
second half #1
now
first half
second half #2
brown
second half #3
cow

如您所见,识别单一模式很容易。现在,我们可以编写一个 awk 程序,该程序仅在前半行直接位于 前半 行之前识别 _后半部分_。 (使用更复杂的状态机,您可以检测任意模式序列。)

 /second half/ {
  if(lastLine == "first half") {
    print
  }
}

{ lastLine = $0 }

如果你运行它,你会看到:

 second half #2

现在,这个例子非常简单,只是一个状态机。有趣的状态仅持续 if 语句的持续时间,并且前面的状态是隐含的,取决于 lastLine 的值。 在更规范的状态机中,您将保留显式状态变量并根据现有状态和当前输入从状态到状态转换。但是你可能不需要那么多的控制机制。

原文由 DigitalRoss 发布,翻译遵循 CC BY-SA 3.0 许可协议

awk 能够处理从开始模式到结束模式

/start-pattern/,/end-pattern/ {
  print
}

我正在寻找如何匹配

 * Implements hook_entity_info_alter().
 */
function file_test_entity_type_alter(&$entity_types) {

如此创造

/\* Implements hook_/,/function / {
  print
}

我需要的内容。一个更复杂的例子是跳过行并擦掉非空格部分。注意 awk 是一个记录(行)和单词(空格分割)的工具。

 # start,end pattern match using comma
/ \* Implements hook_(.*?)\./,/function (.\S*?)/ {
  # skip PHP multi line comment end
  $0 ~ / \*\// skip

  # Only print 3rd word
  if ($0 ~ /Implements/) {
    hook=$3
    # scrub of opening parenthesis and following.
    sub(/\(.*$/, "", hook)
    print hook
  }

  # Only print function name without parenthesis
  if ($0 ~ /function/) {
    name=$2

    # scrub of opening parenthesis and following.
    sub(/\(.*$/, "", name)

    print name
    print ""
  }
}

希望这也有帮助。

另请参阅 GAWK 范围 了解更多信息。

原文由 Clemens Tolboom 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题