ฉันจะ grep ผ่านไฟล์ไบนารีที่ดูเหมือนข้อความได้อย่างไร


76

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



11
คุณลองgrep -aไหม
quanta

คำตอบ:


85

คุณสามารถใช้grepเพื่อค้นหาไฟล์ได้ - มันไม่สนใจเลยว่าไฟล์อินพุตนั้นเป็นข้อความจริงหรือไม่ จาก 'man grep':

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

   --binary-files=TYPE
          If  the  first few bytes of a file indicate that the file contains binary data, assume that the file is
          of type TYPE.  By default, TYPE is binary, and grep normally outputs either a one-line  message  saying
          that a binary file matches, or no message if there is no match.  If TYPE is without-match, grep assumes
          that a binary file does not match; this is equivalent  to  the  -I  option.   If  TYPE  is  text,  grep
          processes  a  binary  file  as  if  it  were  text; this is equivalent to the -a option.  Warning: grep
          --binary-files=text might output binary garbage, which can have nasty side effects if the output  is  a
          terminal and if the terminal driver interprets some of it as commands.

โปรดทำเครื่องหมายคำที่ควรระวังในตอนท้ายของวรรคสอง คุณอาจต้องการเปลี่ยนเส้นทางผลลัพธ์จาก grep เป็นไฟล์ใหม่และตรวจสอบกับ vi / less


grep ใช้งานไม่ได้ ลอง grep บนอุปกรณ์เก็บข้อมูล มันจะมีหน่วยความจำไม่เพียงพอ มันมีกลไกการบัฟเฟอร์ภายในที่หักซึ่งขึ้นอยู่กับความยาวที่เหมาะสม
user239558

41

วางท่อผ่านstringsซึ่งจะดึงเอาเลขฐานสองทั้งหมดออกจากข้อความ


stringsเห็นได้ชัดว่าไม่เข้าใจ utf-8 คือข้อความ
Javier

6

ฉันคิดว่านี่เป็นคำตอบที่ดีที่สุดที่นี่ เป็นที่น่ารำคาญที่จะเห็นการใช้งานที่ไม่ดีของการค้นหาแบบไบนารีเช่นที่นี่commandlinefu.com/commands/matching/grep-binary/...ที่หลบหนีโดยไม่ได้ทำงานจริงๆเหมือนที่นี่\x grep -P "\x05\x00\xc0" mybinaryfile
LéoLéopold Hertz 준영

ผมทำงานbgrep "fafafafa" test_27.6.2015.bin |lessแต่ได้รับtest_27.6.2015.bin: 00005ee4 ฉันคิดว่าจะได้รับfafafafaตั้งแต่ฉันค้นหาสิ่งนี้ ไม่มีคู่มือในมนุษย์ ความคิดใดว่าทำไมเอาท์พุทเช่น?
LéoLéopold Hertz 준영

ฉันเปิดกระทู้ใหม่เกี่ยวกับการทำงานของ bgrep ที่นี่stackoverflow.com/q/31135561/54964
LéoLéopold Hertz 준영

ความแตกต่างgrep -aคืออะไร?
rubo77

แต่น่าเสียดายที่และbash: bgrep: command not found... No package bgrep available

5

คุณสามารถใช้คำสั่งทั้งสามนี้:

  1. grep -a <sth> file.txt

  2. cat -v file.txt | grep <sth>

  3. cat file.txt | tr '[\000-\011\013-\037\177-\377]' '.' | grep <sth>


ดูเหมือนจะไม่ทำงานบนกล่องโซลาริส 10 ของฉัน ทดสอบอย่างง่าย: echo -e 'x \ ty' | tr '[\ 000- \ 011 \ 013- \ 037 \ 177- \ 377]' ' ไม่แปลแท็บ
user55570

1

เริ่มต้นด้วย Grep 2.21, ไฟล์ไบนารีจะได้รับการปฏิบัติที่แตกต่างกัน :

เมื่อค้นหาข้อมูลเลขฐานสองตอนนี้ grep อาจถือว่าไบต์ที่ไม่ใช่ข้อความเป็นตัวยุติบรรทัด สิ่งนี้สามารถเพิ่มประสิทธิภาพได้อย่างมาก

ดังนั้นสิ่งที่จะเกิดขึ้นในตอนนี้คือด้วยข้อมูลไบนารี่ไบต์ที่ไม่ใช่ข้อความทั้งหมด หากคุณต้องการเปลี่ยนพฤติกรรมนี้คุณสามารถ:

  • --textใช้ สิ่งนี้จะช่วยให้มั่นใจได้ว่ามีเพียงการขึ้นบรรทัดใหม่เท่านั้น

  • --null-dataใช้ สิ่งนี้จะทำให้มั่นใจได้ว่ามีเพียง null ไบต์เท่านั้นที่จะเป็นตัวยกเลิกสาย

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