Jak przeglądać pliki binarne, które wyglądają jak tekst?

76

Mam pliki binarne, które powinny być tekstem (są to wyeksportowane dzienniki), ale nie mogę otworzyć go mniej (wygląda brzydko - wygląda jak plik binarny). Odkryłem, że mogę otworzyć go za pomocą vi i mogę to zrobić (zobaczysz rzeczywiste dzienniki), ale tak naprawdę chciałbym to zrobić, przechodząc przez nie (bez konieczności otwierania każdego z nich za pomocą vi, a następnie wykonywania wyszukiwanie). Czy jest na to sposób?

Robyn Smith
źródło
11
Próbowałeś grep -a?
kwanty
1
stackoverflow.com/questions/9988379/...
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Odpowiedzi:

85

Tak czy grepinaczej możesz użyć do przeszukiwania pliku - tak naprawdę nie ma znaczenia, czy plik wejściowy to naprawdę tekst, czy nie. Od „man grep”:

    -a, --text
          Process a binary file as if it were text; this is equivalent to the --binary-files=text option.

   --binary-files=TYPE
          If  the  first few bytes of a file indicate that the file contains binary data, assume that the file is
          of type TYPE.  By default, TYPE is binary, and grep normally outputs either a one-line  message  saying
          that a binary file matches, or no message if there is no match.  If TYPE is without-match, grep assumes
          that a binary file does not match; this is equivalent  to  the  -I  option.   If  TYPE  is  text,  grep
          processes  a  binary  file  as  if  it  were  text; this is equivalent to the -a option.  Warning: grep
          --binary-files=text might output binary garbage, which can have nasty side effects if the output  is  a
          terminal and if the terminal driver interprets some of it as commands.

Proszę zaznaczyć słowa ostrzeżenia na końcu drugiego akapitu. Możesz przekierować wyniki z grep do nowego pliku i sprawdzić to za pomocą vi / less.

Axel Knauf
źródło
grep tak naprawdę nie działa. spróbuj grep na urządzeniu pamięci masowej. zabraknie pamięci. ma uszkodzony mechanizm buforowania wewnętrznego, który zależy od rozsądnych długości linii.
user239558,
41

Przeciągnij go strings, co spowoduje usunięcie całego kodu binarnego, pozostawiając tylko tekst.

Mike Scott
źródło
stringsnajwyraźniej nie rozumie, że utf-8 to tekst.
Javier
6

Dać bgrepszansę. ( oryginalne wydanie / nowszy widelec )

kwanty
źródło
Myślę, że to najlepsza odpowiedź tutaj. To bardzo denerwujące, gdy widzimy złe implementacje wyszukiwania binarnego, takie jak tutaj commandlinefu.com/commands/matching/grep-binary/... gdzie ucieczka \xnie działa tak jak tutaj grep -P "\x05\x00\xc0" mybinaryfile.
Léo Léopold Hertz
Biegnę bgrep "fafafafa" test_27.6.2015.bin |lessale dostać test_27.6.2015.bin: 00005ee4 . Zakładałbym , że dostanę fafafafa , ponieważ tego szukałem. Brak instrukcji obsługi u człowieka. Masz pomysł, dlaczego taki wynik?
Léo Léopold Hertz
Otworzyłem nowy wątek na temat działania bgrep tutaj stackoverflow.com/q/31135561/54964
Léo Léopold Hertz
Jaka jest różnica grep -a?
rubo77
Niestety bash: bgrep: command not found...i No package bgrep available.
5

Możesz użyć tych trzech poleceń:

  1. grep -a <sth> file.txt

  2. cat -v file.txt | grep <sth>

  3. cat file.txt | tr '[\000-\011\013-\037\177-\377]' '.' | grep <sth>

MLSC
źródło
tr nie wydaje się działać na moim pudełku solaris 10. Prosty test: echo -e 'x \ ty' | tr „[\ 000- \ 011 \ 013- \ 037 \ 177- \ 377] '.' nie tłumaczy karty.
user55570
1

Począwszy od Grep 2.21, pliki binarne są traktowane inaczej :

Podczas wyszukiwania danych binarnych grep może teraz traktować bajty nietekstowe jako terminatory linii. Może to znacznie zwiększyć wydajność.

Tak więc teraz dzieje się tak, że w przypadku danych binarnych wszystkie bajty nietekstowe (w tym nowe wiersze) są traktowane jako terminatory linii. Jeśli chcesz zmienić to zachowanie, możesz:

  • użyć --text. Zapewni to, że tylko nowe linie są zakończeniami linii

  • użyć --null-data. Zapewni to, że tylko bajty zerowe są zakończeniami linii

Steven Penny
źródło