Эквивалентная команда для grep бинарных файлов


24

У меня есть куча двоичных файлов, и я знаю, что внутри этих двоичных файлов есть строки, которые я хочу найти.

Я хочу сделать:

grep -lir "the string I am looking for"

и получить список всех двоичных файлов в определенном каталоге, которые содержат эту строку, но grep -lir, очевидно, не работают с этими файлами.

Есть ли команда, которая может выполнять такой поиск с терминала?

Ответы:


24

В GNU grep вы можете использовать опцию -a, чтобы она воспринимала двоичные файлы как текстовые:

grep -ali -- string file

Если ваша версия grep не поддерживает -a, вы можете вместо этого использовать ack . В ack 1.x вам нужно включить -aопцию, в ack 2.x - нет, поскольку при поиске по умолчанию включайте нетекстовый файл (игнорируется нетекстовый файл, если вы не указали никаких файлов).


Я неправильно понимаю ackсамоописание? (в руководстве) «ack 2.x будет искать в каждом обычном недвоичном файле, который явно не игнорируется [бла-бла]». Поэтому, похоже, что ack 2.x должен прекратить чтение файла на ранней стадии, если содержимое выглядит двоичный файл.
Питер Кордес

1
@PeterCordes: это происходит, когда файлы не были выбраны. Попробуйте, ack grep /bin/grepи вы получите результат. Я обновил свой ответ, чтобы избежать путаницы.
Cuonglm

1
Попробуйте использовать команду strings, чтобы получить строки из вашего двоичного файла.
Уве Бургер

23

Команда stringsизвлечет все данные ASCII из файла, если вы затем выводите данные grep, вы можете искать ваши данные:

strings <filename> | grep "search text"

Это должен быть принятый ответ. Этот двоичный файл хорошо подходит для этой задачи.
Владислав Довгальец

5
@xeon: это не всегда удобно strings, читайте здесь для получения более подробной информации.
Cuonglm

1
Поскольку цель состоит в том, чтобы определить, какие двоичные файлы содержат строку, strings -fбыло бы более целесообразным.
Джеймсдлин

Это лучший ответ.
Xofo

9

Ваш вопрос о том, чтобы найти двоичные файлы, содержащие шаблон (и у нас уже есть очень хорошие ответы!). Дополнительно мы можем захотеть получить события.

Я часто использую

grep -aPo '.{0,20}pattern.{0,20}'  binfile

чтобы получить окружающий контекст из 20 символов.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.