当前位置: 首页 > 面试题库 >

awk模式可以匹配多行吗?

汪永春
2023-03-14
问题内容

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

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

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

另一种看待这种情况的方式是,我想隔离日志文件中的几行,并根据几行上的模式匹配来打印出这些行,这些行是特定pkt的详细信息。

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

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


问题答案:

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 的值
在更规范的状态机中,您将保留一个显式状态变量,并根据现有状态和当前输入从一个状态转换到另一个状态。但是您可能不需要那么多的控制机制。



 类似资料:
  • 问题 你正在试着使用正则表达式去匹配一大块的文本,而你需要跨越多行去匹配。 解决方案 这个问题很典型的出现在当你用点(.)去匹配任意字符的时候,忘记了点(.)不能匹配换行符的事实。 比如,假设你想试着去匹配C语言分割的注释: >>> comment = re.compile(r'/\*(.*?)\*/') >>> text1 = '/* this is a comment */' >>> text

  • 问题内容: 我有一个看起来像这样的文件: 该文件包含以开头和结尾的块。请注意,()之间的行数可以不同。我想在第一行中打印所有带有字符串“ test”的块(例如此处的“ SF:/ home / developer / test / resources / …”)。对于此示例,我想要的输出将是: 我想在 Linux 环境中执行此操作。 我的第一个尝试是使用“ sed”命令执行此操作,但是经过一些研究,

  • 我有一个文本文件,其中包含2行样本DNA序列,使用,我想找到与“CCC”匹配的模式,特别是跨越多行的模式(见下面test.txt中第1行末尾到第2行开头)。 测试.txt: 使用命令: 返回: 它似乎正确地突出了第1行中的2个C,然而,它突出了第2行中的第一个C,然后继续完全打印出第二行;给我一个C的复制品。 我在这里做错了什么,我怎样才能避免第二行中重复的C?

  • 我有这个文本文件 我需要输出 我试过这个 但当然,结果是不对的,因为所有的包都有相同的

  • 一、模式匹配 Scala 支持模式匹配机制,可以代替 swith 语句、执行类型检查、以及支持析构表达式等。 1.1 更好的swith Scala 不支持 swith,可以使用模式匹配 match...case 语法代替。但是 match 语句与 Java 中的 switch 有以下三点不同: Scala 中的 case 语句支持任何类型;而 Java 中 case 语句仅支持整型、枚举和字符串常