VIM - 正则表达式 - 多行搜索查询字段值的变化

时间:2014-11-04 21:35:57

标签: regex vim replace sed grep

我有一个庞大的日志文件,其中包含设备驱动程序失败的示例。驱动程序应该从缓冲区提供数据,客户端应用程序读取该数据。驱动程序在读取之前和之后记录缓冲区中的数据量,并以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

所以,我试图匹配多行查询,其中单个转移报告相同的数量"可用"在"之前"和#34;之后"记录声明。

我已经尝试了这个::%s/Before Transfer.* 512 bytes\._*After Transfer.* 512 bytes,它有助于找到一些的问题,但数量可能是1024,或256,或256字节的某个倍数"之前"和#34;之后"记录声明。

此外,此查询似乎突出显示了VIM中一半以上的文件缓冲区。我假设这是因为它在其他查询中找到匹配的查询(即:嵌套结果),因为我还没有为它提供仅与相应"匹配的方法。之前" /"后"日志文件中的实例编号。

我想设置一个正则表达式,遍历每个匹配"之前"和#34;之后"记录行,并查看数据值(字节数)是否相同"之前"和"之后"。如果满足这两个标准,那就是"匹配"至于正则表达式搜索查询是关注的。对于我或多或少手动解析的文件,所需的输出是这样的:

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

如何创建此类查询?

谢谢。

3 个答案:

答案 0 :(得分:2)

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

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

,其中

v / \ v ^(之前|之后)转移/ d
删除之前 之前的开头的每一行

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

v / \ vbefore transfer。{ - }(\ d + bytes)。{ - } \ 1 / d
删除不包含相同字节数的每一行。

答案 1 :(得分:1)

如果这不需要在vim中,你想要的只是失败传输的数量和缓冲区大小,那么这将有效:

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

你可以格式化输出或保存输入行,或者做任何你想做的事情,但这就是想法。

答案 2 :(得分:1)

sed -n '/Before Transfer/ h
        /After Transfer/ { x
           G
           /\(Available  *[0-9]* \).*\1/ s/\n/& /p
           }' YourFile

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