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?

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).


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"

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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.