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.