【问题标题】:VIM - Regex - Multi-Line Search Query for changes in field valueVIM - 正则表达式 - 字段值更改的多行搜索查询
【发布时间】:2014-12-31 22:52:41
【问题描述】:

我有一个包含设备驱动程序失败示例的大量日志文件。驱动程序应该提供来自客户端应用程序读取的缓冲区的数据。驱动程序在读取之前和之后记录缓冲区中的数据量,并以 512 字节块的形式将数据传输到客户端。日志文件中的多行随机散布着大量垃圾数据。下面是一个简短的例子或一个正常的工作案例。

Before Transfer 1: Available 512 bytes
... junk data
After Transfer 1: Available 0 bytes
... junk data
Before Transfer 2: Available 512 bytes
... junk data
After Transfer 2: Available 0 bytes

在错误情况下,它看起来像这样(传输编号仅来自特定示例;问题并不总是发生在传输 #35 上):

Before Transfer 34: Available 512 bytes
... junk data
After Transfer 34: Available 0 bytes
... junk data
Before Transfer 35: Available 512 bytes
... junk data
After Transfer 35: Available 512 bytes

因此,我正在尝试匹配一个多行查询,其中单次传输在“之前”和“之后”日志记录语句中报告了相同数量的“可用”。

我试过这个::%s/Before Transfer.* 512 bytes\._*After Transfer.* 512 bytes,它有助于找到一些问题,但数量可能是 1024、256 或“之前”中 256 字节的倍数和“之后”日志记录语句。

此外,这个查询似乎突出显示了 VIM 中超过一半的文件缓冲区。我假设这是因为它在其他查询中找到匹配的查询(即:嵌套结果),因为我没有为它提供只匹配 corresponding "Before"/"After" 实例的方法日志文件中的数字。

我想设置一个正则表达式,通过每个匹配“之前”和“之后”日志行,并查看数据值(字节数)是否与“之前”相同“ 之后”。如果满足这两个条件,就正则表达式搜索查询而言,它是“匹配”。对于我或多或少手动解析的文件,所需的输出是这样的:

Before Transfer 35: Available 512 bytes
After Transfer 35: Available 512 bytes
Before Transfer 105: Available 256 bytes
After Transfer 105: Available 256 bytes
Before Transfer 220: Available 512 bytes
After Transfer 220: Available 512 bytes
Before Transfer 250: Available 2048 bytes
After Transfer 250: Available 2048 bytes

如何创建这样的查询?

谢谢。

【问题讨论】:

    标签: regex vim replace sed grep


    【解决方案1】:

    使用 vim,您可以使用以下步骤

    v/\v^(before|after) transfer/d
    %norm J
    v/\vbefore transfer.{-}(\d+ bytes).{-}\1/d
    

    在哪里

    v/\v^(before|after) transfer/d
    删除不是以 beforeafter transfer

    开头的每一行

    %norm J 加入所有剩余行。请注意,这假设每个之前都与之后匹配。如果没有,您将不得不删除孤立行(使用正则表达式:))

    v/\v 传输前。{-}(\d+ 字节)。{-}\1/d
    删除不包含 相同 个字节数的每一行。

    【讨论】:

      【解决方案2】:

      如果这不需要在 vim 中并且您只需要失败传输的数量和缓冲区大小,那么这将起作用:

      awk '/^Before Transfer/{s[$3]=$5; next} /^After Transfer/&&(s[$3] == $5) {print "Transfer "$3" failed with "$5" available."; delete s[$3]; next}'
      

      您可以格式化输出或保存输入行,或者在此基础上做任何其他您想做的事情。

      【讨论】:

        【解决方案3】:
        sed -n '/Before Transfer/ h
                /After Transfer/ { x
                   G
                   /\(Available  *[0-9]* \).*\1/ s/\n/& /p
                   }' YourFile
        

        只是在 After 之前添加了一个空格,以便更好地呈现和分隔

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-03-09
          • 2022-01-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-12-05
          • 1970-01-01
          • 2013-03-04
          相关资源
          最近更新 更多