Эквивалентная команда для 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.