我有一些复杂的日志文件,我需要编写一些工具来处理它们。我一直在玩 awk,但我不确定 awk 是否是正确的工具。
我的日志文件是 OSPF 协议解码的打印输出,其中包含各种协议 pkts 及其内容的文本日志,以及用它们的值标识的各种协议字段。我想处理这些文件并仅打印出与特定 pkts 相关的某些日志行。每个 pkt 日志可以包含该 pkt 条目的不同数量的行。
awk 似乎能够处理与模式匹配的单行。我可以找到所需的 pkt,但随后我需要匹配后面几行中的模式,以确定它是否是我要打印的 pkt。
另一种看待这个问题的方法是,我想隔离日志文件中的几行,并根据多行上的模式匹配打印出作为特定 pkt 详细信息的那些行。
由于 awk 似乎是基于行的,我不确定这是否是最好的工具。
如果awk可以做到这一点,它是如何做到的?如果没有,关于使用哪种工具的任何建议?
原文由 Andres Gonzalez 发布,翻译遵循 CC BY-SA 4.0 许可协议
awk 可以轻松检测模式的多行组合,但您需要在代码中创建所谓的 _状态机_ 来识别序列。
考虑这个输入:
如您所见,识别单一模式很容易。现在,我们可以编写一个 awk 程序,该程序仅在前半行直接位于 前半 行之前识别 _后半部分_。 (使用更复杂的状态机,您可以检测任意模式序列。)
如果你运行它,你会看到:
现在,这个例子非常简单,只是一个状态机。有趣的状态仅持续 if 语句的持续时间,并且前面的状态是隐含的,取决于 lastLine 的值。 在更规范的状态机中,您将保留显式状态变量并根据现有状态和当前输入从状态到状态转换。但是你可能不需要那么多的控制机制。