Python相当于unix“strings”实用程序

时间:2013-06-19 15:59:57

标签: python string executable

我正在尝试编写一个脚本,该脚本将从可执行二进制文件中提取字符串并将其保存在文件中。将此文件换行换行不是一种选择,因为字符串本身可能有换行符。但是,这也意味着使用unix“strings”实用程序不是一个选项,因为它只打印出所有新行分隔的字符串,这意味着只能通过查看输出来判断哪些字符串包含换行符。 “弦”。因此,我希望找到一个python函数或库来实现“strings”的相同功能,但是它会将这些字符串作为变量给我,以便我可以避免换行问题。

谢谢!

3 个答案:

答案 0 :(得分:16)

这是一个生成器,它在min中找到所有可打印字符的字符串> = filename(默认为4),其长度为import string def strings(filename, min=4): with open(filename, errors="ignore") as f: # Python 3.x # with open(filename, "rb") as f: # Python 2.x result = "" for c in f.read(): if c in string.printable: result += c continue if len(result) >= min: yield result result = "" if len(result) >= min: # catch result at EOF yield result

for s in strings("something.bin"):
    # do something with s

你可以迭代:

sl = list(strings("something.bin"))

...或存储在列表中:

strings

我对此进行了非常简单的测试,它似乎为我选择的任意二进制文件提供了与Unix strings命令相同的输出。但是,它非常天真(一开始,它会立即将整个文件读入内存,这对于大型文件来说可能很昂贵),并且不太可能接近Unix {{1}}命令的性能。

答案 1 :(得分:3)

引用man strings

STRINGS(1)                   GNU Development Tools                  STRINGS(1)

NAME
       strings - print the strings of printable characters in files.

[...]
DESCRIPTION
       For each file given, GNU strings prints the printable character
       sequences that are at least 4 characters long (or the number given with
       the options below) and are followed by an unprintable character.  By
       default, it only prints the strings from the initialized and loaded
       sections of object files; for other types of files, it prints the
       strings from the whole file.

您可以使用regex匹配至少4个可打印字符来获得类似的结果。这样的事情:

>>> import re

>>> content = "hello,\x02World\x88!"
>>> re.findall("[^\x00-\x1F\x7F-\xFF]{4,}", content)
['hello,', 'World']

请注意,此解决方案需要将整个文件内容加载到内存中。

答案 2 :(得分:-3)

您可以使用csv包来管理字符串中的新行。你只需要一列。