【发布时间】:2015-09-08 16:54:18
【问题描述】:
我在尝试在 .db 文件中搜索字符串时遇到了一些特殊问题。我尝试的方法是使用 grep,它显然可以找到字符串,尽管这是输出:
$ grep "ext" *.db
Binary file enormous.db matches
这有几个问题:
- 我需要返回实际匹配的字符串。
- 我只想从匹配的字符串中返回一个特定的字符串
- 文件名发生变化,所以只有扩展名匹配
- 不止一个有效的扩展名(ext、bin、fck)
区分我正在寻找的字符串的东西 另一个是它总是包含一些随机字符 十六进制 02,然后是文件名。
在上面乱七八糟的乱七八糟的东西中是 TheFile.ext,我希望能抓住它(十六进制如下所示)。也许 grep 不是这个特定任务的正确工具?我不确定,但欢迎提出想法 - 谢谢。
2F46696C65204F6E652E65787400D60F950017416E6F746865722046696C652E657874001003230254686546696C652E65787400D70FA80FA80FA80FA8000F0FA80020416E6F746865722E65787400AE0FB9000FB9000FBA00204D6F726546696C65732E6578747C00000000000000000E52616E646F6D2E65787400BB0C030701404E00000000000003260351012F506174682F546F20536F6D652F66696C652E657874
【问题讨论】:
-
试一试:
grep --binary-files=text -oP '[a-zA-Z0-9_]*\.ext' *.db我假设文件名只包含[A-Za-z0-9_]根据需要更改。 -
@anishsane,不幸的是我不认为我的 grep 是一样的......这是在 osx 上。
grep --binary-files=text -o '[a-zA-Z0-9_]*\.ext' *.db确实返回了一个结果,尽管它是最后一个...file.ext -
要非常小心!从二进制文件中提取文本字符串并不总是有意义的。例如:出于性能原因,数据库可能不会在请求时实际删除数据条目,而是将该记录标记为“可重用”或“免费”。由于您不知道内部数据结构,并且您将非文本数据视为“随机”(这似乎不太可能),因此您不知道您提取的数据是否有效。你真的应该使用数据库函数来获取数据。
-
@cdarke,我完全同意你的看法......我开始认为可能没有一个“简单”的解决方案,因为似乎没有可靠的方法获取字符串。不幸的是,我对如何在这个 db 文件中查询我正在寻找的字符串一无所知。
-
它是什么类型的数据库?你知道它是如何创建的:SQLite?你可以试试:
file *.db。你在 OS X 上吗?
标签: regex string bash shell grep