【问题标题】:Matching string inside file and returning result匹配文件内的字符串并返回结果
【发布时间】:2015-09-08 16:54:18
【问题描述】:

我在尝试在 .db 文件中搜索字符串时遇到了一些特殊问题。我尝试的方法是使用 grep,它显然可以找到字符串,尽管这是输出:

$ grep "ext" *.db
Binary file enormous.db matches

这有几个问题:

  1. 我需要返回实际匹配的字符串。
  2. 我只想从匹配的字符串中返回一个特定的字符串
  3. 文件名发生变化,所以只有扩展名匹配
  4. 不止一个有效的扩展名(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


【解决方案1】:

在 OS X 上使用 bash 中的 sqlite3 似乎相当简单(顺便说一句,我不是这方面的专家)。

您需要找出您需要的表。您可以通过交互式会话来做到这一点。我将向您展示您建议的数据库:

/Users/fredbloggs> sqlite3 ~/Library/Application\ Support/Dock/desktoppicture.db
SQLite version 3.8.5 2014-08-15 22:37:57
Enter ".help" for usage hints.
sqlite> .tables
data         displays     pictures     preferences  prefs        spaces     
sqlite> select * from data;
/Library/Desktop Pictures/Earth and Moon.jpg
sqlite> .exit

我怎么知道是表data?我没有,我尝试了每一个,直到看起来正确:-)

现在我们需要从 bash 脚本运行它:

cmd='select * from data'
fname=$(sqlite3 $HOME/Library/Application\ Support/Dock/desktoppicture.db "$cmd")

echo "filenames are: $fname"

陷阱:似乎是~ 的问题。我一直忘记\“应用程序支持”中的空格。

试一试,看看我们会得到什么。告诉我!

【讨论】:

  • @RoryZipher:太好了!我敢肯定这比搞乱stringsgrep 要好。
【解决方案2】:

您可以使用-a 选项使grep 输出二进制文件中的匹配项。如果您知道文件名由什么类型的字符组成,则可以将输出缩减为文件名。

grep -ao '[[:print:]]*\.ext' *.db

对于不同的文件扩展名,你需要创建一个文件列表。您可以使用查找

find . <search criteria> -exec grep -aoH '[[:print:]]*\.ext' {} \+

已更新以使用我以前不知道的 [[:print:]] 搜索词。

【讨论】:

  • [:print:] 被称为 POSIX 字符类。它们有很多,可以在方括号内组合,例如:[[:alpha:][:punct:]]
【解决方案3】:

grep 因平台而异。以下是在 GNU 和大概在 OS X 上如何做到这一点:

$ grep -ao '[[:print:]]*\.ext' file.bin
/File One.ext
Another File.ext
TheFile.ext
 Another.ext
 MoreFiles.ext
Random.ext
/Path/To Some/file.ext

如果您发现它不起作用,请说明您尝试在哪个平台上使用它。

【讨论】:

  • 我只是在搜索是否有类似[[:print"]] 的东西。 :-) +1
  • 对不起,我应该指定的,它在 osx 上。您显示的命令返回最后一个结果Q/Path/To Some/file.ext。我尝试了strings -ao *.db | grep "ext",这似乎与您很有希望的结果相似。我仍然不确定如何选择正确的文件,但返回的内容 - 谢谢。
猜你喜欢
  • 2020-04-24
  • 2019-09-03
  • 1970-01-01
  • 1970-01-01
  • 2021-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多