שאלה כיצד ניתן לבצע grep באמצעות קבצים בינאריים שנראים כמו טקסט?


יש לי קבצים בינאריים שאמורים להיות טקסט (הם יומנים מיוצאים), אבל אני לא יכול לפתוח את זה עם פחות (זה נראה מכוער - זה נראה כמו קובץ בינארי). מצאתי שאני יכול לפתוח אותו עם vi ואני יכול לחתול אותו (תראה את יומני בפועל), אבל מה אני באמת רוצה לעשות הוא grep דרכם (מבלי לפתוח כל אחד עם vi ולאחר מכן לבצע חיפוש). האם יש לי דרך לעשות זאת?


76
2017-11-05 15:03




serverfault.com/questions/51477/... - quanta
האם ניסית grep -a? - quanta
stackoverflow.com/questions/9988379/... - Ciro Santilli 新疆改造中心 六四事件 法轮功


תשובות:


אתה יכול להשתמש grep בכל מקרה כדי לחפש את הקובץ - זה לא ממש אכפת אם קובץ הקלט הוא באמת טקסט או לא. מ 'גבר 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.


85
2017-11-05 15:48



grep לא באמת עובד. נסה grep במכשיר אחסון. ייגמר הזיכרון. יש מנגנון שבירה פנימי שבור התלוי בקווים באורך סביר. - user239558


תקע אותו strings, אשר יפשיט את כל קוד בינארי עוזב רק את הטקסט.


41
2017-11-05 15:09



רעיון נהדר, תודה :) [לא OP] - Karel Bílek
strings כנראה לא מבין utf-8 הוא טקסט. - Javier


תן bgrep ניסיון. (המהדורה המקורית / עוד מזלג האחרונות)


6
2017-11-05 16:07



אני חושב שזו התשובה הכי טובה כאן. זה כל כך מעצבן לראות יישומים רעים של חיפוש בינארי כמו כאן commandlinefu.com/commands/matching/grep-binary/... שבו להימלט על ידי \x לא ממש עובד כאן grep -P "\x05\x00\xc0" mybinaryfile. - Léo Léopold Hertz 준영
אני רץ bgrep "fafafafa" test_27.6.2015.bin |less אבל לקבל test_27.6.2015.bin: 00005ee4. אני מניח להניח פאפאפאפה, כי חיפשתי את זה. לא ידני באדם. יש לך מושג למה פלט כזה? - Léo Léopold Hertz 준영
פתחתי חוט חדש על תפקוד bgrep כאן stackoverflow.com/q/31135561/54964 - Léo Léopold Hertz 준영
מה ההבדל grep -a? - rubo77
לצערי, bash: bgrep: command not found... ו No package bgrep available. - jww


ניתן להשתמש בשלוש הפקודות הבאות:

  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>


5
2018-06-17 10:43



את tr לא נראה לעבוד על שלי 10 סולאריס. בדיקה פשוטה: הד -e 'x \ ty' | tr '[\ 000- \ 011 \ 013- \ 037 \ 177- \ 377]' '. אינו מתרגם את הכרטיסייה. - user55570


החל מ- Grep 2.21, קבצים בינאריים הם מטופלים אחרתYou

בעת חיפוש נתונים בינאריים, grep יכול כעת לטפל בבתי טקסט שאינם כשורה   . זה יכול לשפר את הביצועים באופן משמעותי.

אז מה שקורה עכשיו זה עם נתונים בינאריים, כל בתים שאינם טקסט (כולל שורות חדשות) מטופלות כמסיימי קו. אם ברצונך לשנות זאת התנהגות, תוכל:

  • להשתמש --text. זה יבטיח כי רק newlines הם line terminators

  • להשתמש --null-data. זה יבטיח כי רק bull null הם line terminators


1
2017-07-18 00:19