在文件中匹配字符串并返回结果

时间:2015-06-23 03:45:08

标签: regex string bash shell grep

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

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

这有几个问题:

  1. 我需要返回实际匹配的字符串。
  2. 我只想从匹配的字符串中返回一个特定的字符串
  3. 文件名更改,因此只有扩展名匹配
  4. 是多个有效的扩展名(分机,分机,fck)
  5.   

    区分我正在寻找的字符串的东西   其他的是它总是包含一些随机字符   通过十六进制02,然后是文件名。

    /File One.ext÷ïAnother File.ext#TheFile.ext◊®®®®® Another.extÆππ∫ MoreFiles.ext|Random.extª@N&Q/Path/To Some/file.ext

    在上面可怕的gunk中, TheFile.ext ,我希望抓住它(hex如下所示)。也许grep不是这个特定任务的正确工具?我不确定,但对想法持开放态度 - 谢谢。

    2F46696C65204F6E652E65787400D60F950017416E6F746865722046696C652E657874001003230254686546696C652E65787400D70FA80FA80FA80FA8000F0FA80020416E6F746865722E65787400AE0FB9000FB9000FBA00204D6F726546696C65732E6578747C00000000000000000E52616E646F6D2E65787400BB0C030701404E00000000000003260351012F506174682F546F20536F6D652F66696C652E657874
    

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分: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"

陷阱:~似乎是一个问题。我一直忘记了\#34;应用程序支持"中的空间。

尝试一下,看看我们得到了什么。让我知道!

答案 2 :(得分:0)

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

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

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

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

已更新,以便使用我之前未知的[[:print:]]搜索字词。