grep trả về tập tin Binary (đầu vào tiêu chuẩn) khớp với tập tin khi cố gắng tìm một mẫu chuỗi trong tập tin


71

Tôi đang dùng Ubuntu và tôi đã gõ cat .bash_history | grep gitvà nó đã quay trở lại

Tệp nhị phân (đầu vào tiêu chuẩn) khớp

My bash_historykhông tồn tại và có nhiều dòng trong đó bắt đầu bằng git.

Điều gì gây ra để hiển thị lỗi này và làm thế nào tôi có thể sửa nó?


Đầu ra của file .bash_history( file ~/.bash_history) là gì?
heemayl

đầu ra là.bash_history: data
answerSeeker

vì một số lý do, điều này chỉ xảy ra với nhật ký apache của tôi. cảm ơn vì q & a
billynoah

liên quan rất chặt chẽ: unix.stackexchange.com/q/19907/5510
Trevor Boyd Smith

Câu trả lời:


11

Có lẽ tệp .bash_historybắt đầu với dữ liệu phi văn bản, do đó grepcoi tệp là nhị phân. Điều này được xác nhận bởi file .bash_historyđầu ra:

.bash_history: data 

Bạn có thể đọc một vài byte từ đầu để có chế độ xem phù hợp:

head -c1K .bash_history 

Ở đây tôi đang đọc 1 KiB đầu tiên.

Bạn có thể đặt STDOUT đến hexdump/ odhoặc tương tự.


Là một ghi chú bên cạnh, greplấy tên tệp (s) làm đối số, vì vậy catvô dụng ở đây; cứ làm đi:

grep git .bash_history

Tôi vẫn không chắc chắn cách giải quyết vấn đề grep, head -c1k .bash_historyhãy đọc 38 dòng đầu tiên của tệp .bash_history của tôi. Mọi thứ đều có thể đọc được
answerSeeker

2
@TatakaiWasumi Sản lượng của là grep -a git .bash_historygì?
heemayl

1
Điều đó đã làm việc! Tôi có mọi thứ tôi muốn từ nó. Không gì -alàm gì?
answerSeeker

6
@TatakaiWasumi -athực hiện grepđể coi tệp là nhị phân.
heemayl

3
-alàm cho grepquá trình một tệp nhị phân như thể nó là văn bản.
lashgar

128

Bạn có thể sử dụng grep -a 'pattern'.

từ trang grep man :

-a, --text
Process a binary file as if it were text; this is equivalent to the ‘--binary-files=text’ option.

Điều này đã giúp tôi khi sử dụng -zcờ để khớp trên một số dòng.
stragu

Câu trả lời này phải là tốt nhất cho câu hỏi này.
Michael Pacheco

Có câu trả lời này là phù hợp hơn nhiều!
Daywalker

3

Tôi đã thấy câu hỏi này ngày hôm nay, bởi vì tôi đã có cùng một vấn đề khi tôi muốn grep của tôi .bash_history. (Lưu ý nhỏ: Tôi đã đổi tên lịch sử của mình để tạo một lịch sử mới. Lịch sử mới này không được coi là nhị phân.)

Trong câu trả lời @heemayls, nó được nêu tên, grepcó tên tệp và catsẽ vô dụng. Điều này không hoàn toàn đúng. Từ greptrang của người đàn ông:

Nếu không có tệp nào được chỉ định hoặc nếu tệp được đưa ra - thì, grep sẽ tìm kiếm đầu vào tiêu chuẩn.

Vì vậy, bạn có thể sử dụng catvà dẫn nó đến grep. Tuy nhiên, điều này không giải quyết được vấn đề .bash_historyđược coi là nhị phân. Điều duy nhất đúng là sử dụng grep -a(Giống như trong câu trả lời từ @AK_) cho dù bạn có greplịch sử trực tiếp hay với catvà một đường ống.


cat .bash_history | grep -a git

hoặc là

grep -a git .bash_history


Cảm ơn bạn! Hoạt động tốt với tôi
Michael Pacheco
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.