【问题标题】:Searching a log file [duplicate]搜索日志文件 [重复]
【发布时间】:2011-09-18 19:02:29
【问题描述】:

可能重复:
Searching using Regex in VIM or elsewhere

我正在为 7 个十六进制值长的特定模式搜索一个巨大的 ~600 Mb 文件。问题是

  1. “模式”可能在下一行,并且
  2. 有几条寻址线。

我摆脱了所有的回车,摆脱了问题 1,但即使值在下一行,我仍然面临着我不知道如何搜索地址行之外的问题。下面是一个例子:
0x000001A0: 36 5B 09 76 99 31 55 09 78 99 34 51 49 BF E0 03
0x000001B0: 28 0B 0A 03 0B E0 07 28 0B 0A 03 0B 49 58 09 35

例如:我希望能够找到模式49 BF E0 03 28 0B 0A,它跨越了上面的第 1 行和第 2 行,但我不能只是定期搜索它,因为行开头的 0x000001B0:建议或 c++ 代码或 excel 想法会有所帮助。我现在用vim打开这个大文件,用excel打不开整个文件。

【问题讨论】:

  • 你想用它做什么?如果您只想查看它,我认为任何开源十六进制查看器都将具有按十六进制功能进行搜索。如果您想在 c++ 脚本中对其进行处理,那就另当别论了。
  • 如果您正在运行 windows,只需在终端或 cygwin 中 grep?
  • 一个 C++ 程序一次读取一行,跳过地址,然后搜索该行加上前一行似乎并不难写。你试过了吗?
  • @AJG85 grep 是否有办法在文本可以与中间的其他任意文本越界时进行搜索?
  • 我只想看看它。然后从那里遍历那个模式,直到我找到我需要的东西

标签: c++ excel search vim


【解决方案1】:

Python,只需在行中读取,拆分,夹住第一部分,将十六进制连接成一个字符串,然后搜索。这样的事情会起作用:

hex = ""
for each line in lines:
    tmp = line.split() // split on whitespace
    hex += tmp[1:] // grab everything after address

if hex.contains(pattern):
    # do something

或者使用正则表达式,但你会明白基本的想法。

【讨论】:

  • 我也想过提供一个 Python 解决方案,但这个问题专门针对 C++。在执行搜索之前我不会阅读整个文件,它似乎效率低下并且不保留定位结果可能需要的地址。
  • 任何熟悉可以工作的十六进制查看器的人?我基本上想在整个文件中“查看”模式
  • @Steve 感谢您的链接。唯一的问题是,这是一个“文本”文件,而查看者不知道它应该显示十六进制值,我该如何讲述它。嘿,其中一些是十六进制的?我正在查看 XVI32,它甚至将文件中某处的文本变成了十六进制
  • 是的,这些将与作为您手头文本来源的二进制数据一起使用。那不再可用了吗?如果你还有原始的二进制数据,这个问题就容易回答了。
【解决方案2】:

您可以使用循环缓冲区。

  1. 打开文件
  2. 读一行
  3. 读取地址并将其丢弃
  4. 读取第一个值并将其放入缓冲区
  5. 读取下一个值,并抛出缓冲区的最后一个值(std::list 可能会很好)
  6. 检查缓冲区是否包含模式
  7. 循环 5 直到行尾
  8. 循环 2 直到文件末尾

【讨论】:

  • 不是我想要做的。对不起
猜你喜欢
  • 2011-05-01
  • 1970-01-01
  • 2021-07-23
  • 1970-01-01
  • 2023-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-29
相关资源
最近更新 更多