ทำไม grep ไม่สนใจไฟล์ไบนารีโดยปริยาย


94

manpage สำหรับgrepอธิบาย-Iแฟล็กดังนี้:

-I      Ignore binary files.  This option is equivalent to 
        --binary-file=without-match option.

มันยังบอกว่าเรื่องนี้เกี่ยวกับไฟล์ไบนารี:

 --binary-files=value Controls searching and printing of binary files.
         Options are binary, the default: search binary files but do not print
         them; without-match: do not search binary files; and text: treat all
         files as text.

ฉันไม่สามารถนึกถึงสถานการณ์ที่ฉันสนใจเกี่ยวกับการจับคู่ในไฟล์ไบนารี หากสถานการณ์ดังกล่าวมีอยู่แน่นอนมันจะต้องเป็นข้อยกเว้นมากกว่าบรรทัดฐาน เหตุใดจึงไม่grepเพิกเฉยต่อไฟล์ไบนารีโดยค่าเริ่มต้นแทนที่จะกำหนดให้ตั้งค่าสถานะนี้ให้ทำ


4
คุณสามารถตั้งค่าตัวแปรGREP_OPTIONSเป็นการตั้งค่าที่คุณต้องการจากนั้นคุณไม่จำเป็นต้องใช้สวิตช์บรรทัดคำสั่งจำนวนมาก
Marco

2
หมายเหตุสำหรับคำสั่งอื่น ๆ ที่ไม่สนับสนุนตัวแปรดังกล่าว: คุณสามารถตั้งค่าตัวเลือกเริ่มต้นโดยกำหนดนามแฝงใน.(ba|z|foo)shrc': นามแฝงของคุณgrep = "grep -I"
Erik

1
สิ่งนี้มีประโยชน์มากจริงๆ ตัวอย่างเช่นฉันค้นหารุ่นที่เป็นเอกภาพของโครงการและจำไม่ได้ว่าไฟล์ใดถูกเก็บไว้ฉันค้นหารูปแบบของรุ่นและมันก็มาพร้อมกับไฟล์ไบนารีบางส่วนที่ตรงกับ มันกลับกลายเป็นว่ามันเป็นรุ่น pre-5 รุ่นนั้นมีอยู่ในไฟล์ไบนารีเท่านั้นดังนั้นหากไม่มีการจับคู่แบบไบนารีฉันอาจพลาดไป
Svend Hansen

FYI มีเครื่องมือที่เป็นแอ๊กชั่นซึ่งเป็นชนิดของ "ดีกว่า grep" Ack ไม่ค้นหาไฟล์ไบนารี ใน Debian มันมาภายใต้ชื่อ "ack-grep"
teika kazura

คำตอบ:


91

ไม่ใช่ทุกสิ่งที่ grep คิดว่าเป็นไฟล์ไบนารี แต่จริงๆแล้วเป็นไฟล์ไบนารี เช่นบันทึกของหุ่นเชิดมีรหัสสี ansi ซึ่งทำให้ grep คิดว่ามันเป็นเลขฐานสอง ฉันยังคงต้องการค้นหาพวกเขาหากฉัน grepping ผ่าน / var / log ว่า


4
เช่นเดียวกันสำหรับไฟล์ PDF เช่นกัน
Joseph R.

12
+ grep ที่ผ่านมาไม่สามารถทำได้ดังนั้นเพื่อความเข้ากันได้เท่านั้นค่าเริ่มต้นต้องรวมทุกอย่าง
Olivier Dulac

2
@OlivierDulac เหมาะสมแล้วมิฉะนั้นการละเว้นไฟล์ไบนารีควรเป็นค่าเริ่มต้น
Dagang

5

grepความสามารถในการค้นหาไฟล์ไบนารียังมีประโยชน์เมื่อฉันรวบรวมโปรแกรมและตัวเชื่อมโยง ( ld) บ่นเกี่ยวกับฟังก์ชั่นบางอย่างที่ไม่พบ ฉันสามารถใช้คำสั่งเช่น

grep function_name / lib / lib *

เพื่อค้นหาไลบรารีที่มีอยู่ (ไลบรารีเป็นไฟล์ไบนารี)


ในกรณีที่คุณต้องการใช้grep -l function_name /lib/lib*หรือnm -Do /lib/lib* | grep function_nameหรือldconfig -p | grep -o '/.*/lib.*' | xargs nm -Do | grep function_nameว่า
Stéphane Chazelas

ดีgrep some_function /lib/*สั้นกว่าและมักจะให้คำตอบที่ถูกต้อง - ชื่อของห้องสมุดที่ฉันกำลังมองหา แต่ใช่บางครั้งก็ต้องใช้วิธีการที่ซับซ้อนกว่าเช่นคุณ
Daniel Frużyński
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.