使用 grep 找到的字符串不输出文本

使用 grep 找到的字符串不输出文本

我正在(Windows)可执行文件中寻找某些字符串。

首先我开始于

grep -a string file

因为它将二进制文件视为文本文件。问题是没有整齐的输出,换行符偶然发生(当正确的字节按顺序出现时)等。

所以我想我应该使用字符串:

strings file | grep -i string

令我惊讶的是,“strings”找不到我使用“grep -a”找到的字符串。然而,“字符串”的优点在于它可以输出在新行中找到的所有内容的每一项。

我如何才能两全其美?这意味着我想真正找到所有内容,并获得所发现内容的合理输出。

答案1

找不到strings与您的字符串相同的模式很可能是由于strings找到至少 4 个字符长的模式造成的后跟一个不可打印的字符。来自man stringsGNU strings

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.

除此之外,strings默认情况下仅扫描目标文件的初始化和加载部分,这可能会进一步减少输出的行数。

您可以尝试-a-n选项来更改该行为:

strings -n 1 -a file | grep -i string

这应该会给你更多的字符串,并且可能是你所期望的。

我的可执行文件的输出差异python

$ strings $(which python) | wc
  31923   68075  474068
$ strings -n 1 $(which python) | wc
 501231  531837 1541204
$ strings -n 1 -a $(which python) | wc
 501398  531995 1541762

答案2

为什么不:

grep -a string file | strings

strings打印至少 4 个字符长的可打印字符序列。因此,如果您的grep内容少于 4 个字符,则strings首先通过 via 处理将导致它丢失。用于strings -n 1将最小长度设置为 1。

相关内容