Odpowiednik polecenia grep dla plików binarnych

24

Mam kilka plików binarnych i wiem, że wewnątrz tych plików binarnych są ciągi, które chcę znaleźć.

Chcę zrobić:

grep -lir "the string I am looking for"

i uzyskać listę wszystkich plików binarnych w określonym katalogu, który zawiera ten ciąg, ale grep -lirnajwyraźniej nie działa z tymi plikami.

Czy istnieje polecenie, które może wykonywać tego rodzaju wyszukiwanie z terminala?

Kosmiczny pies
źródło

Odpowiedzi:

24

W GNU grep możesz użyć opcji -a , aby traktować pliki binarne jako pliki tekstowe:

grep -ali -- string file

Jeśli twoja wersja grep nie obsługuje -a, możesz zamiast tego użyć ack . W przypadku ack 1.x musisz dołączyć -aopcję, w przypadku ack 2.x nie, ponieważ podczas wyszukiwania domyślnie dołączaj plik nietekstowy (zignoruj ​​plik nietekstowy tylko wtedy, gdy nie określisz żadnych plików).

Cuonglm
źródło
Czy mylę się ackz opisem własnym? (w podręczniku) „ack 2.x przeszuka każdy zwykły plik niebinarny, który nie jest wyraźnie ignorowany [przez bla bla]]„ Wygląda więc na to, że ack 2.x powinien przestać czytać plik wcześniej, jeśli zawartość wygląda dwójkowy.
Peter Cordes
1
@PeterCordes: Dzieje się tak, gdy nie wybrano żadnych plików. Spróbuj, ack grep /bin/grepa otrzymasz wynik. Zaktualizowałem swoją odpowiedź, aby uniknąć pomyłek.
cuonglm
1
Spróbuj użyć polecenia strings, aby pobrać ciągi z pliku binarnego.
Uwe Burger
23

Polecenie stringswyodrębni wszystkie dane ascii z pliku, jeśli następnie grepjego dane wyjściowe, możesz wyszukać swoje dane:

strings <filename> | grep "search text"
NZD
źródło
To powinna być zaakceptowana odpowiedź. Ten plik binarny jest odpowiedni do tego zadania.
Vladislavs Dovgalecs
5
@xeon: Nie zawsze warto go używać strings, przeczytaj tutaj, aby uzyskać więcej informacji.
cuonglm
1
Ponieważ celem jest ustalenie, które pliki binarne zawierają ciąg, strings -fbyłoby bardziej odpowiednie.
jamesdlin
To lepsza odpowiedź.
Xofo,
9

Twoje pytanie dotyczy znalezienia plików binarnych zawierających wzorzec (a my mamy już bardzo dobre odpowiedzi!). Uzupełniające możemy chcieć uzyskać zdarzenia.

Często używam

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

uzyskać otaczający kontekst 20 znaków.

JJoao
źródło