返回/转换然后返回带有空值的模式

返回/转换然后返回带有空值的模式

我正在使用 grep/sed 解析一个大型二进制文件,其中包含一些特定数据,这些文件充满了空值。这是在使用 gnuwin32 的 Windows 环境中。

假设我有一些从二进制文件返回的数据,如下所示(十六进制表示):

42 9D E1 0A 01 FF FF FF FF FF FF FF 7F 00 FE FF FF 0A 01 E1 0A 01 C0 0B 00 4D 00
00 9C E1 0A 01 2C 41 38 B4 15 FB 49 00 4D 00 41 00 48 00 4F 00 53 00 54 00 31 00
32 00 33 00 2E 00 73 00 75 00 62 00 2E 00 64 00 6F 00 6D 00 61 00 69 00 6E 00 2E
00 73 00 74 00 61 00 2E 00 6F 00 72 00 67 00 2E 00 61 00 75

但仅匹配上面的这部分:

49 00 4D 00 41 00 48 00 4F 00 53 00 54 00 31 00 32 00 33

我该如何使用 grep 和/或 sed 来解决这个问题?null 的存在会对 grep 造成一些不利影响,特别是因为我实际上需要将数据作为自动文件解析器的一部分返回。

下面的 grep 几乎可以完成我想要的操作:

grep -Prino ".{0,100}I\000M\000A\000H\000O\000S\000T\0001\0002\0003.{0,100}" "d:\dhcp.mdb"

但是它只返回“二进制文件 d:\dhcp.mdb 匹配”,而不是匹配的模式,可能是因为有空值。如果这有效,一旦我有两边各 100 个字符,我就会通过匹配 IP 地址(遵循可 grepp 格式)和域名(始终以 3 个空值结尾)来 grep 这个子集,找到我需要的内容

因为它是一个数据库文件,所以我可能使用不同的方法,比如实际与数据库交互,但我觉得我非常接近这种方法。

使用 Sed,我实际上能够从一个更小的文件中看到返回数据,我将一些相关数据粘贴到了该文件中:

sed -rn "/\I\x00M\x00A\x00H\x00O\x00S\x00T\x001\x002\x003/p" "D:\cruft\Hxma.txt"

但是我不确定如何像上面的 grep 一样返回匹配前 100 个字符和匹配后 100 个字符,当我针对 12MB 数据库文件运行它时,它没有返回任何内容(取消静默选项,因此它打印模式空间显示它获得了~10KB然后显然放弃了)

有人知道我该如何解决这个问题吗?我应该补充一点,只要没有数据丢失,返回数据的实际格式就不太重要(除了空值,我根本不需要它们)。

如果有帮助的话,我想要匹配的文本数据的实际格式似乎是2字节unicode,尽管我需要与匹配一起返回的一些数据(即前4个字节,即小端IP地址)不是unicode。

答案1

您正在告诉 grep 要查找什么。您不知道刚刚告诉 grep 要查找什么的概念很奇怪,我不明白。grep 的目的是查找您提供的模式;而不是查找您已经知道位置的字符串。我认为您需要更清楚地定义您缺少的这个难题的哪一部分。

此外,大多数数据库都有命令行工具。尽管 MS 没有为其数据库制作出色的工具,但有一个名为MDB 工具这将允许您实际使用 SQL 来搜索数据库。这无疑是完成您在此处尝试执行的操作的更好方法。

最后,如果你确实想使用 grep 在二进制文件中搜索字符串,我强烈建议你使用二进制实用程序包。这将在您搜索数据之前过滤掉不可打印的字符。它还可以打印出方便的偏移量(这是您在这种情况下通常想要的)。以下是它的示例(它将在 grep 二进制文件中搜索任何包含单词“deprecated”的字符串):

strings -a -t x /bin/grep|grep deprecated

如您所见,这将更不容易出错。我还没有检查过它的速度,但我确信这在很大程度上取决于实际的二进制内容。

更新

刚刚意识到你在 Windows 上工作。Systernals 制作了一个版本字符串工具这与Linux字符串程序非常相似。

strings.exe -a -o C:\GnuWin\bin\grep.exe|grep deprecated

另外,你可以尝试杰克塞斯适用于任何支持 JVM 的操作系统的命令行 MDB 工具。

相关内容