grep zwraca „Dopasowania pliku binarnego (standardowe wejście)” podczas próby znalezienia wzorca łańcucha w pliku

70

Jestem na Ubuntu i pisałem na maszynie, cat .bash_history | grep gita ona wróciła

Plik binarny (standardowe wejście) pasuje

Mój bash_historyistnieje i jest w nim wiele linii, które zaczynają się od git.

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

answerSeeker
źródło
Jaka jest wydajność funkcji file .bash_history( file ~/.bash_history)?
heemayl
dane wyjściowe to.bash_history: data
answerSeeker
z jakiegoś powodu działo się tak z moimi dziennikami Apache. dzięki za
pytania
bardzo blisko powiązane: unix.stackexchange.com/q/19907/5510
Trevor Boyd Smith

Odpowiedzi:

11

Prawdopodobnie plik .bash_historyzaczyna się od danych nietekstowych, dlatego greptraktuje plik jako plik binarny. Potwierdza to file .bash_historywynik:

.bash_history: data 

Możesz przeczytać 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/ odlub podobnego.


Na marginesie, grepbierze nazwę pliku (-ów) jako argument, więc cattutaj jest bezużyteczny; po prostu zrób:

grep git .bash_history
heemayl
źródło
Nadal nie jestem pewien, jak rozwiązać problem grep, head -c1k .bash_historyprzeczytaj pierwsze 38 wierszy mojego pliku .bash_history. Wszystko było czytelne
answerSeeker
2
@TatakaiWasumi Jaka jest wydajność grep -a git .bash_history?
heemayl
1
To się udało! Mam z tego wszystko, czego chciałem. Co ma -azrobić?
answerSeeker
6
@TatakaiWasumi -asprawia, grepże plik jest traktowany jako binarny.
heemayl
3
-aprzekształć grepplik binarny tak, jakby był tekstem.
lashgar,
127

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

ze strony man grep :

-a, --text
Process a binary file as if it were text; this is equivalent to the ‘--binary-files=text’ option.
AK_
źródło
Pomogło mi to podczas używania -zflagi do dopasowania w kilku liniach.
stragu 24.04.18
Ta odpowiedź powinna być najlepsza dla tego pytania.
Michael Pacheco
Tak, ta odpowiedź jest znacznie bardziej odpowiednia!
Daywalker
3

Widziałem to pytanie dzisiaj, ponieważ miałem ten sam problem, kiedy chcę grep mój .bash_history. (Mała uwaga: zmieniłem nazwę mojej historii, aby powstała nowa. Ta nowa historia nie była traktowana jako plik binarny).

W odpowiedzi @heemayls jest powiedziane, że greppobiera nazwy plików i catbyłby bezużyteczny. To nie do końca prawda. Ze grepstrony podręcznika użytkownika:

Jeśli nie podano żadnych plików lub podano plik „-”, grep wyszukuje standardowe dane wejściowe.

Możesz więc użyć go cati potokować grep. Nie rozwiązuje to jednak problemu, który .bash_historyjest traktowany jako plik binarny. Jedyną słuszną rzeczą jest użycie grep -a(jak w odpowiedzi z @AK_) niezależnie od tego, czy masz grephistorię bezpośrednio, czy za catpomocą fajki.


cat .bash_history | grep -a git

lub

grep -a git .bash_history

SSCMuchacho
źródło
Dziękuję Ci! Działa dla mnie dobrze
Michael Pacheco