grep mengembalikan "File biner (input standar) cocok" ketika mencoba menemukan pola string dalam file

71

Saya di Ubuntu dan saya mengetik cat .bash_history | grep gitdan kembali

File biner (input standar) cocok

Saya bash_historymemang ada dan ada banyak baris di dalamnya yang dimulai dengan git.

Apa yang menyebabkan tampilan kesalahan ini dan bagaimana cara memperbaikinya?

answerSeeker
sumber
Apa output dari file .bash_history( file ~/.bash_history)?
heemayl
outputnya adalah.bash_history: data
answerSeeker
untuk beberapa alasan ini hanya terjadi dengan log apache saya. terima kasih atas q & a
billynoah
terkait sangat erat: unix.stackexchange.com/q/19907/5510
Trevor Boyd Smith

Jawaban:

11

Agaknya file .bash_historydimulai dengan data non-teks, karenanya grepmemperlakukan file sebagai biner. Ini dikonfirmasi oleh file .bash_historyoutput:

.bash_history: data 

Anda dapat membaca beberapa byte dari awal untuk memiliki tampilan yang sesuai:

head -c1K .bash_history 

Di sini saya membaca 1 KiB pertama.

Anda dapat mengirim pipa STDOUT ke hexdump/ odatau serupa.


Sebagai catatan tambahan, grepgunakan nama file sebagai argumen, jadi cattidak berguna di sini; kerjakan saja:

grep git .bash_history
heemayl
sumber
Saya masih tidak yakin bagaimana menyelesaikan masalah grep, head -c1k .bash_historybaca 38 baris pertama file .bash_history saya. Semuanya dapat dibaca
answerSeeker
2
@TatakaiWasumi Apa hasilnya grep -a git .bash_history?
heemayl
1
Itu berhasil! Saya mendapatkan semua yang saya inginkan darinya. Apa yang -aharus dilakukan
answerSeeker
6
@TatakaiWasumi -amenjadikan grepfile ini sebagai biner.
heemayl
3
-amembuat grepproses file biner seolah-olah itu teks.
lashgar
128

Anda bisa menggunakannya grep -a 'pattern'.

dari halaman manual grep :

-a, --text
Process a binary file as if it were text; this is equivalent to the ‘--binary-files=text’ option.
AK_
sumber
Ini telah membantu saya ketika menggunakan -zbendera untuk mencocokkan beberapa baris.
stragu
Jawaban ini harus menjadi yang terbaik untuk pertanyaan ini.
Michael Pacheco
Ya jawaban ini jauh lebih cocok!
Daywalker
3

Saya telah melihat pertanyaan ini hari ini, karena saya mempunyai masalah yang sama ketika saya ingin mengerti .bash_history. (Catatan Kecil: Saya mengubah nama riwayat saya, sehingga yang baru dibuat. Sejarah baru ini tidak diperlakukan sebagai biner.)

Dalam jawaban @heemayls dinyatakan, itu grepmengambil nama file dan cattidak berguna. Ini tidak sepenuhnya benar. Dari grephalaman manual s:

Jika tidak ada file yang ditentukan, atau jika file "-" diberikan, grep mencari input standar.

Jadi Anda bisa menggunakan catdan mengirimnya ke pipa grep. Namun ini bukan memecahkan masalah yang .bash_historydiperlakukan sebagai biner. Satu-satunya hal yang benar adalah menggunakan grep -a(Seperti dalam jawaban dari @AK_) apakah Anda grepsejarah langsung atau dengan catdan pipa.


cat .bash_history | grep -a git

atau

grep -a git .bash_history

SSCMuchacho
sumber
Terima kasih! Bekerja dengan baik untuk saya
Michael Pacheco