Строки, не выводящие текст, найденные с помощью grep

Строки, не выводящие текст, найденные с помощью grep

Я ищу определенные строки в исполняемых файлах (Windows).

Сначала я начал с

grep -a string file

поскольку это обрабатывает двоичные файлы как текстовые. Проблема в том, что нет аккуратного вывода, разрывы строк происходят случайно (когда правильные байты идут в порядке) и т. д.

Поэтому я подумал, что воспользуюсь строками:

strings file | grep -i string

К моему удивлению, 'strings' не находит строки, которые я смог найти с помощью 'grep -a'. Однако 'strings' хорош тем, что выводит каждый элемент того, что находит, на новой строке.

Как мне получить лучшее из обоих миров? То есть я хочу действительно найти все, а также получить разумный вывод того, что было найдено.

решение1

Это stringsне находит те же шаблоны, что и ваша строка, скорее всего, вызвано stringsпоиском шаблонов длиной не менее 4 символов.иза которым следует непечатаемый символ. Из man stringsдля GNU 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 символов, обработка через stringsfirst приведет к его пропуску. Используйте strings -n 1для установки минимальной длины в 1.

Связанный контент