grep zwraca “ Plik binarny (standardowe wejście) pasuje do ” podczas próby znalezienia wzorca ciągu w pliku

Ja „m na Ubuntu i wpisałem cat .bash_history | grep git i wróciło

Plik binarny (standardowe wejście) pasuje

Mój bash_history istnieje i jest w nim wiele wierszy zaczyna się od git.

Co spowodowało wyświetlenie tego błędu i jak mogę go naprawić?

Komentarze

  • Jaki jest wynik działania file .bash_history (file ~/.bash_history)?
  • wynik .bash_history: data
  • z jakiegoś powodu to właśnie działo się z moimi dziennikami Apache. Dzięki za q & a
  • bardzo blisko spokrewniony: unix.stackexchange.com/q/19907/5510

Odpowiedz

Presuma bly plik .bash_history zaczyna się od danych nietekstowych, dlatego grep traktuje plik jako binarny. Potwierdza to file .bash_history wyjście:

.bash_history: data 

Możesz odczytać kilka bajtów od początku, aby uzyskać zgodny widok:

head -c1K .bash_history 

Tutaj czytam pierwszy 1 KiB.

Możesz przesłać STDOUT do hexdump / od lub podobny.


Na marginesie, grep przyjmuje nazwę pliku ( s) jako argument, więc cat jest tutaj bezużyteczne; spróbuj tego:

grep git .bash_history 

Komentarze

  • I ' Nadal nie jestem pewien, jak rozwiązać problem grepa, head -c1k .bash_history przeczytaj pierwsze 38 wierszy mojego pliku .bash_history. Wszystko było czytelne.
  • @TatakaiWasumi. Jaki jest wynik działania grep -a git .bash_history?
  • To zadziałało! Dostałem od niego wszystko, czego chciałem. Co robi -a?
  • @TatakaiWasumi -a sprawia, że grep traktować plik jako binarny.
  • -a make grep przetwarza plik binarny tak, jakby był tekstem.

Odpowiedź

Możesz użyć grep -a "pattern".

ze strony man grep :

-a, –text
Przetwarzaj plik binarny tak, jakby był tekstem; jest to odpowiednik opcji –binary-files = text .

Komentarze

  • Pomogło mi to przy używaniu flagi -z do dopasowania w kilku wierszach.
  • U mnie zadziałało, ale nadal jest dziwne, ponieważ mój plik nie jest ' plikiem binarnym. [grid @ serverdg2 trace] $ file listener.log listener.log: data

Odpowiedź

Miałem ten sam problem, gdy chcę grepować mój .bash_history. (Mała uwaga: zmieniłem nazwę mojej historii, aby powstała nowa. Ta nowa historia nie była traktowana jako binarna.)

W odpowiedzi @heemayls jest napisane, że grep przyjmuje nazwy plików i cat byłoby bezużyteczne. To nie jest do końca prawdą. Ze strony podręcznika grep:

Jeśli nie określono żadnych plików lub jeśli plik „-” jest biorąc pod uwagę, grep przeszukuje standardowe wejście.

Więc możesz użyć cat i przesłać go potokiem do grep. Jednak to nie rozwiązuje problemu, że .bash_history jest traktowane jako plik binarny. Jedyną właściwą rzeczą jest użycie grep -a (jak w odpowiedzi z @AK_) niezależnie od tego, czy grep historię bezpośrednio, czy z cat i potok.


cat .bash_history | grep -a git 

lub

grep -a git .bash_history 

Odpowiedź

Błąd wynika z tego, że dane w pliku są binarne, możesz użyć polecenia string, aby zobaczyć czytelną dla człowieka (tj. strings) część, którą normalnie szukałbyś za pomocą grep

strings data | grep -i whatever

Komentarze

  • To nie dotyczy pierwszej części pytania, tj. " co powoduje problem ".

Odpowiedź

Może to być spowodowane przez null bajtów w Twojej historii bash. Usunięcie wierszy zawierających znaki puste może rozwiązać problem. Możesz je sprawdzić w trybie Perl-regexp grepa:

grep -Pa "\x00" .bash_history 

Ten post ma sugestie dla systemów innych niż unix.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *