কিছু বাইনারি ডেটা রয়েছে এমন কোনও পাঠ্য ফাইলকে গ্রেপ করবেন কীভাবে?


122

গ্রেপ রিটার্ন

বাইনারি ফাইল টেস্ট.লগ মেলে

উদাহরণ স্বরূপ

echo    "line1 re \x00\r\nline2\r\nline3 re\r\n" > test.log  # in zsh
echo -e "line1 re \x00\r\nline2\r\nline3 re\r\n" > test.log  # in bash
grep re test.log

আমি আশা করি ফলাফলটি লাইন 1 এবং লাইন 3 (মোট দুটি লাইন) প্রদর্শিত হবে।

trগ্রিপকে আবার কাজ করতে দিতে কী অপ্রিনিতযোগ্য ডেটাটিকে পঠনযোগ্য ডেটাতে রূপান্তর করা ব্যবহার করা সম্ভব ?


দয়া করে নোট করুন যে একটি প্রোগ্রাম রয়েছে যা বাইনারি ফাইল থেকে বাইনারি অক্ষরগুলি ফিল্টার করে এবং কেবল পাঠ্য অক্ষর (পঠনযোগ্য) রাখে। এখানে: soft.tahionic.com/download-words_extractor/index.html
InNameOfScience

মাফ করবেন, কিন্তু ... -eআপনি কি echoকমান্ড মিস করছেন না ?
সোপালাজো ডি অ্যারিরেজ

আপনি যদি 'zsh' ব্যবহার করেন তবে তা -e ছাড়াই ঠিক আছে। আপনি যদি 'বাশ' ব্যবহার করেন তবে আপনার '-e' যুক্ত করা উচিত।
ড্যানিয়েল ওয়াইসি লিন

উত্তর:


67

আপনি cat -vউদাহরণস্বরূপ ডেটা ফাইল চালাতে পারেন

$ cat -v tmp/test.log | grep re
line1 re ^@^M
line3 re^M

যা পরে আরও পোস্ট-প্রক্রিয়াজাত হতে পারে জাঙ্কটি অপসারণ করতে; trএটি টাস্কের জন্য ব্যবহার সম্পর্কে আপনার প্রশ্নের সাথে সাদৃশ্যপূর্ণ ।


5
আমার সমস্যার সমাধান। ধন্যবাদ! এখানে যা man catসম্পর্কে বলা হয়েছে তা হল -v:-v, --show-nonprinting use ^ and M- notation, except for LFD and TAB
tommy.carstensen

নোট করুন যে এটি পাইপলাইনেও কাজ করে। যেমনset | cat -v | grep variable
ফানরল

1
গ্রেপ - টেক্সট যদি কাজ করে তবে কেন এটি ব্যবহার করবেন? এটি অনেক বেশি জটিল বলে মনে হচ্ছে।
মাইকেল হাফেল

grep --textসবসময় কাজ করে না; এটি ফাইল টার্মিনেটর হিসাবে CTRL + D কে সম্মান করে। সুতরাং আপনার যদি আপনার বাইনারি ফাইলটিতে থাকে তবে গ্রেপ তাড়াতাড়ি প্রস্থান করবে।
টমি

110
grep -a

এটি এর চেয়ে সহজতর হতে পারে না।


3
এই একই হিসাবে grep --textযা paxdiablo 2 বছর আগে উল্লেখ করেছে
user829755

4
হ্যাঁ, যদি আপনি নিম্নলিখিতটি না করেন তবে ওএসএক্সে এটি কাজ করবে না:LC_ALL="C" grep -a
ক্রিস স্ট্র্যাটন

91

একটি উপায় হ'ল বাইনারি ফাইলগুলিকে যাইহোক টেক্সট হিসাবে বিবেচনা করা, grep --textতবে এর ফলে বাইনারি তথ্যগুলি আপনার টার্মিনালে প্রেরণে ভাল ফলাফল হতে পারে। যদি আপনি এমন একটি টার্মিনাল চালাচ্ছেন যা আউটপুট প্রবাহকে ব্যাখ্যা করে (যেমন ভিটি / ডিসি বা আরও অনেকগুলি)।

বিকল্পভাবে, আপনি trনিম্নলিখিত কমান্ড দিয়ে আপনার ফাইলটি প্রেরণ করতে পারেন :

tr '[\000-\011\013-\037\177-\377]' '.' <test.log | grep whatever

এটি .কেবলমাত্র মুদ্রণযোগ্যগুলি রেখে, একটি স্থানের অক্ষর (নিউলাইন ব্যতীত) এবং 126 এর চেয়ে বড় কিছুকে একটি অক্ষরে পরিণত করবে।


আপনি যদি প্রতিটি "অবৈধ" চরিত্রকে আলাদা আলাদা করে প্রতিস্থাপন করতে চান তবে আপনি নিম্নলিখিত সি প্রোগ্রামের মতো কিছু ব্যবহার করতে পারেন, একটি সর্বোত্তম স্ট্যান্ডার্ড ইনপুট ফিল্টার:

#include<stdio.h>
int main (void) {
    int ch;
    while ((ch = getchar()) != EOF) {
        if ((ch == '\n') || ((ch >= ' ') && (ch <= '~'))) {
            putchar (ch);
        } else {
            printf ("{{%02x}}", ch);
        }
    }
    return 0;
}

এটি আপনাকে দেবে {{NN}}, NNচরিত্রটির জন্য হেক্স কোডটি কোথায় । আপনি printfযে স্টাইল আউটপুট চান তা কেবল সামঞ্জস্য করতে পারেন।

আপনি সেই প্রোগ্রামটি এখানে কর্মক্ষেত্রে দেখতে পাবেন যেখানে এটি:

pax$ printf 'Hello,\tBob\nGoodbye, Bob\n' | ./filterProg
Hello,{{09}}Bob
Goodbye, Bob

এই পদ্ধতিটি সমস্ত বাইনারি চরকে একই হিসাবে ম্যাপিং করছে '' প্রতীক। তাদের পাঠযোগ্য প্রতীকগুলিতে ম্যাপিংয়ের কোনও অন্য পদ্ধতি রয়েছে?
ড্যানিয়েল ওয়াইসি লিন

অবশ্যই, আপনি এটি একটি পৃথক ফিল্টার প্রোগ্রামের মাধ্যমে চালাতে পারবেন, যার মধ্যে একটি আমি একটি আপডেট সরবরাহ করেছি।
প্যাক্সডিয়াবলো

1
আমার মনে tr '[:cntrl:] '.'হয় আরও ভাল। এবং এটি \000-\010\013\014\016-\037\177-\377'আপনার টিআর সিনট্যাক্সে থাকা উচিত ।
ড্যানিয়েল ওয়াইসি লিন

2
পরীক্ষার পরে, tr '[\000-\010\013\014\016-\037\177-\377]' '_'কার্যকর, cntrl আমার ক্ষেত্রে উপযুক্ত নয়।
ড্যানিয়েল ওয়াইসি লিন

2
আপনি সংরক্ষণ করতে পারবেন catবংশীধ্বনিতুল্য ধাপে grep --textমধ্যে trতদ্বিপরীত পরিবর্তে। এটি আপনাকে একাধিক ফাইল গ্রেপ করতে এবং আউটপুটে ফাইলের নাম উল্লেখ রাখতে দেয়।
অ্যান্টোইন

33

উদাহরণস্বরূপ, বাইনারি ফাইল থেকে স্ট্রিংগুলি বের করতে আপনি "স্ট্রিংস" ব্যবহার করতে পারেন

strings binary.file | grep foo

উত্সটি প্রতিটি লাইনে ইউআইডি সহ একটি ডিবাগ লগ হওয়ায় আমার পক্ষে ভাল কাজ করেছে। ধন্যবাদ।
mbrownnyc

আমার জন্য খুব ভাল কাজ করে। আপনার উত্তরের জন্য ধন্যবাদ. আমার দিন
শেখর

2
আমি @ প্যাক্সিয়াবলোর জবাবের প্রশংসা করি তবে দ্রুত উত্তর দেওয়ার জন্য এবং কাজের সাথে চালিয়ে যাওয়ার জন্য আপনি এই দোষ করতে পারবেন না।
Wil

প্যাক্সিডাব্লো সমাধানটি ব্যবহার করার চেষ্টা করেছি তবে এটি আমার প্রত্যাশার ফলাফলগুলির একটিও দেয় নি। @ মুডিওয়ুডি আপনার সমাধানটি দ্রুত, সহজ এবং ঠিক আমার যা প্রয়োজন ঠিক ফলাফল আউটপুট দেয়!
justinhartman

20

আপনি গ্রেপকে বাইনারি ফাইলগুলি এটির জন্য বাধ্য করতে পারেন:

grep --binary-files=text

আপনি যোগ করতেও চাইবেন -o( --only-matching) যাতে আপনি টন বাইনারি গিব্বারিশ না পান যা আপনার টার্মিনালটিকে বোঝায়।


বাইনারি আবর্জনা আউটপুট দিতে পারে, যা আউটপুট একটি টার্মিনাল হয় এবং টার্মিনাল ড্রাইভার কমান্ড হিসাবে এর কিছু ব্যাখ্যা করে যদি খারাপ অভ্যাস হতে পারে।
ড্যানিয়েল ওয়াইসি লিন

আপনি যদি ব্যবহার করেন --only-matching, এবং আপনার রেজেক্স স্বেচ্ছাসেবী বাইনারি ডেটার সাথে মেলে না, আপনার কোনও সমস্যা হবে না।
এবি

যদি নিয়মিত প্রকাশটি প্রথম হয় * শেষ হয় এবং বাইনারি ডেটাতে "। *" প্যাটার্ন থাকে তবে এটি আমার পোস্ট প্রসেসিংয়ের প্রক্রিয়াটি সঠিক করতে পারে না। যাইহোক ধন্যবাদ.
ড্যানিয়েল ওয়াইসি লিন

16

গ্রেপ 2.21 দিয়ে শুরু করে, বাইনারি ফাইলগুলি আলাদাভাবে চিকিত্সা করা হয় :

বাইনারি ডেটা অনুসন্ধান করার সময়, গ্রেপ এখন অ-পাঠ্য বাইটগুলিকে লাইন টার্মিনেটর হিসাবে বিবেচনা করতে পারে। এটি পারফরম্যান্সকে উল্লেখযোগ্যভাবে বাড়াতে পারে।

সুতরাং এখন যা ঘটে তা হ'ল বাইনারি ডেটা সহ, সমস্ত অ-পাঠ্য বাইট (নিউলাইনগুলি সহ) লাইন টার্মিনেটর হিসাবে বিবেচিত হয়। আপনি যদি এই আচরণটি পরিবর্তন করতে চান তবে আপনি:

  • ব্যবহার --text। এটি নিশ্চিত করবে যে কেবলমাত্র নতুনলাইনগুলি লাইন টার্মিনেটর

  • ব্যবহার --null-data। এটি নিশ্চিত করবে যে কেবল নাল বাইটগুলি লাইন টার্মিনেটর


5

গ্রেপ -a গ্রেপকে এমন কোনও ফাইল থেকে অনুসন্ধান এবং আউটপুট দিতে বাধ্য করবে যা গ্রেপ মনে করে বাইনারি। grep -a re test.log


3

যেমনটি জেমস সেলভাকুমার ইতিমধ্যে বলেছিলেন, grep -aকৌতুকটি করে। -a বা --text পাঠ্য হিসাবে ইনপুটস্ট্রিম পরিচালনা করতে গ্রেপকে বাধ্য করে। মানচিত্রটি http://unixhelp.ed.ac.uk/CGI/man-cgi?grep দেখুন

চেষ্টা

cat test.log | grep -a somestring

2

আপনি করতে পারেন

strings test.log | grep -i

এর ফলে আউটপুটটিকে গ্রেডে পাঠযোগ্য স্ট্রিং হিসাবে রূপান্তরিত করা হবে।


0

আপনি ওয়ার্ড এক্সট্রাক্টর সরঞ্জামও চেষ্টা করতে পারেন । বাইনারি কোড (উদাহরণ অ্যাপ্লিকেশন, ডিএলএল) থেকে মানব পাঠ্য / শব্দযুক্ত স্ট্রিংগুলিকে আলাদা করতে আপনার কম্পিউটারের যে কোনও ফাইলের সাথে ওয়ার্ড এক্সট্র্যাক্টর ব্যবহার করা যেতে পারে।


আমি আমার ক্ষেত্রে, আমার শব্দের এক্সট্র্যাক্টর দরকার নেই, আমার লাইন নম্বরটি রাখা দরকার।
ড্যানিয়েল ওয়াইসি লিন

0

আমি এমন একটি সিস্টেমে যা ব্যবহার করেছি যেখানে "স্ট্রিং" কমান্ড ইনস্টল করা হয়নি

cat yourfilename | tr -cd "[:print:]"

এটি পাঠ্য মুদ্রণ করে এবং "ক্যাট-ভি ফাইলনাম" এর বিপরীতে একের মধ্যে ছাপছাড়া অক্ষরগুলিকে সরিয়ে দেয়, যার জন্য অযাচিত জিনিসগুলি সরাতে কিছু পোস্টপ্রসেসিং প্রয়োজন। নোট করুন যে বাইনারি কিছু ডেটা মুদ্রণযোগ্য হতে পারে তাই আপনি এখনও ভাল স্টাফের মধ্যে কিছুটা জিব্রিশ পাবেন। আমি মনে করি আপনি যদি এটি ব্যবহার করতে পারেন তবে স্ট্রিংগুলি এই জিব্রিশকে সরিয়ে দেয়।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.