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?



11
Próbowałeś grep -a?
kwanty

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.


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.


stringsnajwyraźniej nie rozumie, że utf-8 to tekst.
Javier

6

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


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>


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

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.