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

Regex 匹配文件中的字符串并返回结果,regex,string,bash,shell,grep,Regex,String,Bash,Shell,Grep,我在尝试搜索.db文件中的字符串时遇到了一些特殊问题。我尝试的方法是使用grep,它显然找到了字符串,尽管这是输出: $ grep "ext" *.db Binary file enormous.db matches 这有几个问题: 我需要返回实际匹配的字符串 我只想从匹配的字符串中返回一个特定的字符串 文件名更改,因此只有扩展名匹配 有多个有效扩展名(分机、bin、fck) 区别我要找的字符串的东西 另一个是它总是包含一些随机字符 按十六进制02,然后是文件名 grep -ao '[[:pr

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

$ grep "ext" *.db
Binary file enormous.db matches
这有几个问题:

  • 我需要返回实际匹配的字符串
  • 我只想从匹配的字符串中返回一个特定的字符串
  • 文件名更改,因此只有扩展名匹配
  • 有多个有效扩展名(分机、bin、fck)
  • 区别我要找的字符串的东西 另一个是它总是包含一些随机字符 按十六进制02,然后是文件名

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

    在上面可怕的混乱中,gunk是文件。ext,我希望能抓到它(十六进制如下所示)。也许grep不是这个特定任务的合适工具?我不确定,但愿意接受各种想法——谢谢

    2F46696C65204F6E652E65787400D60F950017416E6F746865722046696C652E657874001003230254686546696C652E65787400D70FA80FA80FA80FA8000F0FA80020416E6F746865722E65787400AE0FB9000FB9000FBA00204D6F726546696C65732E6578747C00000000000000000E52616E646F6D2E65787400BB0C030701404E00000000000003260351012F506174682F546F20536F6D652F66696C652E657874
    

    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
    

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

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

    grep -ao '[[:print:]]*\.ext' *.db
    
    对于不同的文件扩展名,您需要创建一个文件列表。你可以用find

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

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

    在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
    
    我怎么知道是表
    数据
    ?我没有,我试了每一个直到它看起来合适:-)

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

    cmd='select * from data'
    fname=$(sqlite3 $HOME/Library/Application\ Support/Dock/desktoppicture.db "$cmd")
    
    echo "filenames are: $fname"
    
    Gotchas:似乎是
    ~
    的问题。我一直忘了
    \
    在“应用程序支持”中的空格


    试一试,看看我们能得到什么。让我知道

    试试:
    grep--binary files=text-oP'[a-zA-Z0-9\]*\.ext'*.db
    我假设文件名只包含
    [a-zA-Z0-9\]
    根据需要更改它。@Anishane,不幸的是我认为我的grep不一样。。。这是在osx上
    grep--binary files=text-o'[a-zA-Z0-9\]*\.ext'*.db
    确实返回了一个结果,尽管这是最后一个结果
    file.ext
    小心点!从二进制文件中提取文本字符串并不总是有意义的。例如:出于性能原因,数据库可能不会在请求时实际删除数据条目,而是将该记录标记为“可重用”或“免费”。由于您不知道内部数据结构,并且将非文本数据视为“随机”(这似乎不太可能),因此您不知道所提取的数据是否有效。你真的应该使用数据库函数来获取数据。@cdarke,我完全同意你的看法。。。我开始认为可能没有一个“简单”的解决方案,因为似乎没有一种可靠的方法来获取字符串。不幸的是,对于如何查询这个数据库文件以查找我要查找的字符串,我一点也不知道。它是什么类型的数据库?你知道它是如何创建的吗:SQLite?您可以尝试:
    文件*.db
    。你在osx上吗?我只是在搜索是否有类似于
    [[:print”]
    :-)+1抱歉,我应该指定,它在osx上。你显示的命令将最后一个结果
    Q/Path/返回到Some/file.ext
    。我尝试了
    strings-ao*.db | grep“ext“
    这似乎与您的结果相似,这是有希望的。我仍然不确定如何选择正确的文件,尽管返回的是什么-谢谢。
    [:print:]
    被称为POSIX字符类。它们有很多,可以组合在方括号内,例如:
    [:alpha:[:punt:][:punt:][]
    @RoryZipher:太棒了!我相信这比处理
    字符串和
    grep
    要好。