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ć?


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

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

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.

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


Dziękuję Ci! Działa dla mnie dobrze
Michael Pacheco
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.