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
这有几个问题:
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
要好。