ฉันอยู่บน Ubuntu และฉันพิมพ์cat .bash_history | grep gitและมันกลับมา
ไฟล์ไบนารี (อินพุตมาตรฐาน) ตรงกัน
ฉันไม่อยู่และมีหลายสายในนั้นที่เริ่มต้นด้วยbash_historygit
เกิดอะไรขึ้นกับแสดงข้อผิดพลาดนี้และฉันจะแก้ไขได้อย่างไร
.bash_history: data
ฉันอยู่บน Ubuntu และฉันพิมพ์cat .bash_history | grep gitและมันกลับมา
ไฟล์ไบนารี (อินพุตมาตรฐาน) ตรงกัน
ฉันไม่อยู่และมีหลายสายในนั้นที่เริ่มต้นด้วยbash_historygit
เกิดอะไรขึ้นกับแสดงข้อผิดพลาดนี้และฉันจะแก้ไขได้อย่างไร
.bash_history: data
คำตอบ:
สันนิษฐานว่าไฟล์.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
head -c1k .bash_historyอ่าน 38 บรรทัดแรกของไฟล์. bash_history ของฉัน ทุกอย่างสามารถอ่านได้
grep -a git .bash_historyอะไร?
-aทำอย่างไร
-aทำให้grepไฟล์นั้นเป็นแบบไบนารี
-aทำให้grepกระบวนการไบนารีไฟล์ราวกับว่ามันเป็นข้อความ
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แฟล็กเพื่อจับคู่ข้ามหลายบรรทัด
ฉันได้เห็นคำถามนี้ในวันนี้เพราะผมมีปัญหาเดียวกันเมื่อฉันต้องการ 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
file .bash_history(file ~/.bash_history) คืออะไร