คำสั่งเทียบเท่ากับ grep ไฟล์ไบนารี


24

ฉันมีเครือข่ายมากมายและฉันรู้ว่าภายในไบนารีเหล่านี้มีสตริงที่ฉันต้องการค้นหา

ฉันต้องการที่จะทำ:

grep -lir "the string I am looking for"

และรับรายการไบนารีทั้งหมดภายในไดเรกทอรีเฉพาะที่มีสตริงนั้น แต่grep -lirดูเหมือนจะไม่ทำงานกับไฟล์เหล่านี้

มีคำสั่งที่สามารถทำการค้นหาชนิดนี้จากเทอร์มินัลหรือไม่

คำตอบ:


24

ด้วยGNU grepคุณสามารถใช้ตัวเลือก-aเพื่อทำให้เป็นไฟล์ไบนารีเป็นไฟล์ข้อความ:

grep -ali -- string file

หากเวอร์ชัน grep ของคุณไม่รองรับ-aคุณสามารถใช้ackแทน ด้วย ack 1.x คุณจะต้องรวม-aตัวเลือกด้วย ack 2.x คุณจะไม่ต้องทำเนื่องจากเมื่อค้นหาไฟล์ที่ไม่ใช่ข้อความตามค่าเริ่มต้น (ละเว้นเฉพาะไฟล์ที่ไม่ใช่ข้อความเมื่อคุณไม่ได้ระบุไฟล์ใด ๆ )


ฉันกำลังอ่านackคำอธิบายของตัวเองผิดหรือเปล่า? (ในคู่มือ) "แอค 2.x จะค้นหาไฟล์ปกติที่ไม่ใช่ไบนารีทุกไฟล์ซึ่งจะไม่ถูกละเว้นอย่างชัดเจน [โดย blah blah]" ดังนั้นดูเหมือนแอ๊ 2.x ควรหยุดอ่านไฟล์ก่อนถ้าเนื้อหาดู เลขฐานสอง.
Peter Cordes

1
@PeterCordes: เกิดขึ้นเมื่อไม่มีไฟล์ใดถูกเลือก ลองack grep /bin/grepแล้วคุณจะได้ผลลัพธ์ ฉันอัพเดตคำตอบเพื่อป้องกันความสับสน
cuonglm

1
ลองใช้คำสั่ง strings เพื่อรับสตริงจากไบนารี่ของคุณ
Uwe Burger

23

คำสั่งstringsจะแยกข้อมูล ASCII ทั้งหมดจากไฟล์หากคุณgrepส่งออกแล้วคุณสามารถค้นหาข้อมูลของคุณ:

strings <filename> | grep "search text"

นี่ควรเป็นคำตอบที่ยอมรับได้ ไบนารีนี้เหมาะสำหรับงานนี้
Vladislavs Dovgalecs

5
@xeon: มันไม่ได้เสมอดีที่จะใช้stringsอ่านที่นี่สำหรับรายละเอียดเพิ่มเติม
cuonglm

1
เนื่องจากเป้าหมายคือการกำหนดซึ่งไบนารีประกอบด้วยสตริงstrings -fจะเหมาะสมกว่า
jamesdlin

นี่เป็นคำตอบที่ดีกว่า
Xofo

9

คำถามของคุณเกี่ยวกับการหาไฟล์ไบนารีที่มีรูปแบบ (และเรามีคำตอบที่ดีมาก!) เสริมเราอาจต้องการที่จะได้รับเหตุการณ์ที่เกิดขึ้น

ฉันมักจะใช้

grep -aPo '.{0,20}pattern.{0,20}'  binfile

เพื่อรับบริบทโดยรอบของ 20-char

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