grep ส่งคืน“ การจับคู่ไฟล์ไบนารี (อินพุตมาตรฐาน)” เมื่อพยายามค้นหารูปแบบสตริงในไฟล์


71

ฉันอยู่บน Ubuntu และฉันพิมพ์cat .bash_history | grep gitและมันกลับมา

ไฟล์ไบนารี (อินพุตมาตรฐาน) ตรงกัน

ฉันไม่อยู่และมีหลายสายในนั้นที่เริ่มต้นด้วยbash_historygit

เกิดอะไรขึ้นกับแสดงข้อผิดพลาดนี้และฉันจะแก้ไขได้อย่างไร


ผลลัพธ์ของfile .bash_history( file ~/.bash_history) คืออะไร
heemayl

ผลลัพธ์คือ.bash_history: data
answerSeeker

ด้วยเหตุผลบางอย่างนี้เกิดขึ้นกับบันทึก apache ของฉัน ขอบคุณสำหรับ
คำถาม

เกี่ยวข้องอย่างใกล้ชิดมาก: unix.stackexchange.com/q/19907/5510
Trevor Boyd Smith

คำตอบ:


11

สันนิษฐานว่าไฟล์.bash_historyเริ่มต้นด้วยข้อมูลที่ไม่ใช่ข้อความดังนั้นจึงgrepถือว่าไฟล์เป็นไบนารี นี่คือการยืนยันโดยการfile .bash_historyส่งออก:

.bash_history: data 

คุณสามารถอ่านไม่กี่ไบต์ตั้งแต่เริ่มต้นเพื่อให้มีมุมมองที่สอดคล้องกัน:

head -c1K .bash_history 

ที่นี่ฉันกำลังอ่าน 1 KiB แรก

คุณสามารถไปป์ STDOUT ไปยังhexdump/ odหรือที่คล้ายกัน


ในฐานะที่เป็นบันทึกด้านgrepใช้ชื่อไฟล์ (s) เป็นอาร์กิวเมนต์จึงcatไม่มีประโยชน์ที่นี่; แค่ทำ:

grep git .bash_history

ฉันยังไม่แน่ใจว่าจะแก้ปัญหา grep ได้อย่างไรhead -c1k .bash_historyอ่าน 38 บรรทัดแรกของไฟล์. bash_history ของฉัน ทุกอย่างสามารถอ่านได้
answerSeeker

2
@ TakakaiWasumi เอาท์พุทของgrep -a git .bash_historyอะไร?
heemayl

1
นั่นได้ผล! ฉันได้ทุกสิ่งที่ฉันต้องการจากมัน อะไร-aทำอย่างไร
answerSeeker

6
@TatakaiWasumi -aทำให้grepไฟล์นั้นเป็นแบบไบนารี
heemayl

3
-aทำให้grepกระบวนการไบนารีไฟล์ราวกับว่ามันเป็นข้อความ
lashgar

128

grep -a 'pattern'คุณสามารถใช้

จากหน้าgrep ของมนุษย์ :

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

สิ่งนี้ช่วยฉันได้เมื่อใช้-zแฟล็กเพื่อจับคู่ข้ามหลายบรรทัด
stragu

คำตอบนี้ควรจะดีที่สุดสำหรับคำถามนี้
Michael Pacheco

ใช่คำตอบนี้เหมาะสมกว่ามาก!
Daywalker

3

ฉันได้เห็นคำถามนี้ในวันนี้เพราะผมมีปัญหาเดียวกันเมื่อฉันต้องการ grep .bash_historyของฉัน (หมายเหตุเล็กน้อย: ฉันเปลี่ยนชื่อประวัติของฉันเพื่อให้สร้างใหม่ประวัติใหม่นี้ไม่ได้รับการปฏิบัติเป็นไบนารี)

ใน @heemayls คำตอบมีการระบุไว้ว่าgrepใช้ชื่อไฟล์และcatจะไร้ประโยชน์ สิ่งนี้ไม่เป็นความจริงทั้งหมด จากgrepหน้าคน:

หากไม่ได้ระบุไฟล์หรือระบุไฟล์“ -” grep จะค้นหาอินพุตมาตรฐาน

เพื่อให้คุณสามารถใช้และท่อมันcat grepอย่างไรก็ตามวิธีนี้ไม่ได้แก้ปัญหาที่.bash_historyจะถือว่าเป็นไบนารี สิ่งที่ถูกต้องคือใช้grep -a(เช่นเดียวกับคำตอบจาก @AK_) ไม่ว่าคุณจะgrepประวัติโดยตรงหรือด้วยcatและไปป์


cat .bash_history | grep -a git

หรือ

grep -a git .bash_history


ขอขอบคุณ! ทำงานได้ดีสำหรับฉัน
Michael Pacheco
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.