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
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_historyprzeczytaj 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
-asprawia, żegreptraktować plik jako binarny. -
-amakegrepprzetwarza 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
-zdo 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.
file .bash_history(file ~/.bash_history)?.bash_history: data