কীভাবে ইউনিকোডের জন্য গ্রেপ করবেন a ব্যাশ স্ক্রিপ্টে


11
if grep -q "�" out.txt
    then
        echo "working"
    else
        cat out.txt
fi

মূলত, যদি "out.txt" ফাইলটিতে ফাইলের যে কোনও জায়গায় " " থাকে তবে আমি এটি "कार्यरत" প্রতিধ্বনিত করতে চাই এবং যদি "আউট.টেক্সট" ফাইলটি ফাইলের কোথাও " " না থাকে তবে আমি চাই এটি বিড়াল to.txt

সম্পাদনা: সুতরাং আমি এখানে যা করছি তা এখানে। আমি জোর করে একটি ওপেনসেল ডিক্রিপট চেষ্টা করার চেষ্টা করছি।

ওপেনএসএল এনকো 0 সাফল্যে 0 ফেরায়, অন্যথায় শূন্য নয়। দ্রষ্টব্য: আপনি মিথ্যা ধনাত্মকতা পাবেন কারণ এইএস / সিবিসি কেবল নির্ধারণ করতে পারে প্যাডিং সঠিক হওয়ার উপর ভিত্তি করে "ডিক্রিপশন কাজ করে"। সুতরাং ফাইলটি ডিক্রিপ্ট হয়ে যায় তবে এটি সঠিক পাসওয়ার্ড হবে না সুতরাং এতে এতে জিব্রিশ হবে। জিব্বারিশের একটি সাধারণ চরিত্র হ'ল "।"। সুতরাং আমি আউটপুটে " " উপস্থিত থাকলে ডুপ লুপটি চালু রাখতে চাই।

আমার গিট লিঙ্কটি এখানে আছে https://github.com/Raphaeangelo/OpenSSLCracker স্ক্রিপ্টটি এখানে

while read line
do
openssl aes-256-cbc -d -a -in $1 -pass pass:$line -out out.txt 2>out.txt >/dev/null && printf "==================================================\n"
if grep -q "�" out.txt
    then
        :
    else
        cat out.txt &&
            printf "\n==================================================" &&
            printfn"\npassword is $line\n" &&
            read -p "press return key to continue..." < /dev/tty; 
fi
done < ./password.txt

এটি এখনও আমাকে এতে চ্যারিকটার দিয়ে আউটপুট দেখাচ্ছে

আপডেট: সমাধান হয়েছে S

printf "Working..."

while read line
do
openssl aes-256-cbc -d -a -in $1 -pass pass:$line -out out.txt 2>out.txt >/dev/null
if file out.txt | grep -q 'out.txt: ASCII text'
    then
        printf "\n==================================================\n\n" &&
            cat out.txt &&
            printf "\n==================================================" &&
            printf "\npassword is $line\n" && 
            read -p "press return key to continue..." < /dev/tty;
    else
        : 
fi
done < ./password.txt

এটি সঠিক দেখাচ্ছে, এটি কাজ করা উচিত (বিটিডব্লিউ, আপনার ইউনিকোড চরিত্রটি দেখার জন্য আমার কোনও ফন্ট নেই, তবে তাদের কোনওটিরই বিশেষ অর্থ নেই)। grepদীর্ঘক্ষণ ইউনিকোড বোঝে (যা এটি অনেক ধীর করে তোলে, তাই এসকি স্ট্রিংগুলি অনুসন্ধান করার জন্য, LANG=C grepএটি একটি বিশাল কর্মক্ষমতা উন্নতি) is
পিটারহ - মনিকা

আমাকে এটি মুছতে এবং অন্য একটি প্রশ্ন পোস্ট করতে হতে পারে কারণ আমি নিশ্চিত যে আমি এখানে সবাইকে পুরোপুরি বিভ্রান্ত করছি।
স্টুয়ার্ট স্লোয়ান

@ স্টুয়ার্ট স্লোয়ান আপনার প্রশ্নের শিরোনাম এটিই How to grep for unicode � in a bash scriptকি আপনি চান? ইউনিকোড বের করতে? দয়া করে পরিষ্কার করুন যাতে আমরা সাহায্য করতে পারি!

1
@ গোরো আমি আমার মূল পোস্টে সম্পাদনা করেছি। আমি এটা জ্ঞান করে তোলে আশা করি। এটি না হলে দয়া করে আমাকে জানান এবং আমি একটি স্পষ্ট করার চেষ্টা করব।
স্টুয়ার্ট স্লোয়ান

1
উভয় উপস্থিত উত্তর অত্যন্ত বিভ্রান্তিকর। দয়া করে আমার উত্তরটি পড়ুন (আবার) , আমি এটি সম্পাদনা করেছি যাতে উভয় উত্তরই ভুল ah
আইজাক

উত্তর:


27

grep কাজের জন্য ভুল সরঞ্জাম।

আপনি দেখতে পাচ্ছেন U+FFFD REPLACEMENT CHARACTERbecause কারণ এটি ফাইলের অক্ষরে অক্ষরে অক্ষরে নয়, আপনি কেবল এমন একটি সরঞ্জাম সহ একটি বাইনারি ফাইলটির দিকে তাকিয়েছিলেন যা কেবল পাঠ্য-ভিত্তিক ইনপুট হ্যান্ডেল করার কথা। অবৈধ ইনপুট (যেমন, র্যান্ডম বাইনারি ডেটা) হ্যান্ডেল করার স্ট্যান্ডার্ড উপায় হ'ল স্ক্রিনে হিট হওয়ার আগে বর্তমান লোকেলের (সম্ভবত সম্ভবত ইউটিএফ -8) বৈধ নয় এমন সমস্ত কিছু প্রতিস্থাপন করা।

এর অর্থ এটি খুব সম্ভবত যে কোনও আক্ষরিক \xEF\xBF\xBD(ইউ + এফএফএফডি চরিত্রের জন্য ইউটিএফ -8 বাইট অনুক্রম) ফাইলটিতে কখনও ঘটে না। grepআপনাকে বলার ক্ষেত্রে সম্পূর্ণরূপে সঠিক, কোনওটি নেই।

কোনও ফাইলের মধ্যে কিছু অজানা বাইনারি রয়েছে কিনা তা সনাক্ত করার একটি উপায় হ'ল file(1)কমান্ডটি সহ:

$ head -c 100 /dev/urandom > rubbish.bin
$ file rubbish.bin
rubbish.bin: data

যে কোনও অজানা ফাইল টাইপের জন্য এটি সহজভাবে বলবে data। চেষ্টা

$ file out.txt | grep '^out.txt: data$'

ফাইলটিতে সত্যই কোনও স্বেচ্ছাচারী বাইনারি রয়েছে এবং এইভাবে সম্ভবত আবর্জনা রয়েছে কিনা তা পরীক্ষা করতে।

আপনি যদি এটি নিশ্চিত করতে চান যে এটি out.txtকেবলমাত্র একটি ইউটিএফ -8 এনকোডযুক্ত পাঠ্য ফাইল, আপনি বিকল্পভাবে ব্যবহার করতে পারেন iconv:

$ iconv -f utf-8 -t utf-16 out.txt >/dev/null

আপনি ঠিক ঠিক বলেছেন! দুর্ভাগ্যক্রমে, আমি আউটপুটটিতে এখনও কিছু (আগের চেয়ে কম) আবর্জনা পাচ্ছি।
স্টুয়ার্ট স্লোয়ান

fileএই ফাইলগুলির জন্য সম্ভবত কিছু অন্যান্য সামগ্রীর ধরণ সনাক্ত করে। আপনি যদি 100% সর্বদা কেবল UTF-8 এনকোডযুক্ত পাঠ্য ফাইলগুলি আশা করেন তবে আপনি iconvযদি ফাইলটি বৈধ UTF-8: হয় তা পরীক্ষা করে দেখতে পারেন iconv -f utf-8 -t utf-16 out.txt >/dev/null। যদি iconvঅবৈধ ইউটিএফ -8 সিকোয়েন্সগুলির কারণে ফাইলটি রূপান্তর করতে না পারে তবে এটি একটি শূন্য-বহির্গমন কোডের সাথে ফিরে আসবে।
বোল্ডউইন

2
ফাইল কমান্ড ঠিক ছিল! আপনি আমার সমস্যা সমাধানে আমাকে সাহায্য করেছেন ধন্যবাদ!
স্টুয়ার্ট স্লোয়ান

4
অবশ্যই সেই গ্রেপ "কাজের জন্য সরঞ্জাম", চেষ্টা করুন grep -axv '.*' badchars.txt। এটি কোনও অবৈধ ইউনিকোড অক্ষরযুক্ত যে কোনও লাইন মুদ্রণ করবে ।
আইজাক

1
এটি অত্যন্ত বিভ্রান্তিকর, দয়া করে আমার উত্তরটি পড়ুন কী fileকরে does
আইজাক

5

টি এল; ডিআর:

grep -axv '.*' out.txt 

দীর্ঘ উত্তর

উভয় উপস্থিত উত্তর অত্যন্ত বিভ্রান্তিকর এবং মূলত ভুল।

পরীক্ষা করতে, এই দুটি ফাইল পান (অত্যন্ত সম্মানিত বিকাশকারী: মার্কাস কুহানের কাছ থেকে):

$ wget https://www.cl.cam.ac.uk/~mgk25/ucs/examples/UTF-8-demo.txt
$ wget https://www.cl.cam.ac.uk/~mgk25/ucs/examples/UTF-8-test.txt

ডেমো

প্রথমটি UTF-8-demo.txtইউটিএফ -8 বিভিন্ন ভাষা, গণিত, ব্রেইল এবং অন্যান্য অনেক দরকারী ধরণের অক্ষর উপস্থাপন করতে সক্ষম হয় তা দেখানোর জন্য ডিজাইন করা একটি ফাইল। একটি পাঠ্য সম্পাদক (যা utf-8 বুঝতে পারে) এর সাথে একবার দেখুন এবং আপনি প্রচুর উদাহরণ দেখতে পাবেন এবং না

এই পরীক্ষার একটি উত্তর প্রস্তাব করে: চরিত্রের সীমাটি সীমাবদ্ধ করতে \x00-\x7Fএই ফাইলটির অভ্যন্তরে প্রায় সমস্ত কিছুই প্রত্যাখ্যান করবে।
এটি খুব ভুল এবং যে কোনও ফাইলকে অপসারণ করা হবে না কারণ সেই ফাইলটিতে নেই

এই উত্তরে প্রস্তাবিত পরীক্ষাটি ব্যবহার করা 72.5 %ফাইলটি সরিয়ে ফেলবে :

$ grep -oP "[^\x00-\x7F]" UTF-8-demo.txt | tr -d '\n' | wc -c
10192
$ cat UTF-8-demo.txt | wc -c
14058

এটি (বেশিরভাগ ব্যবহারিক উদ্দেশ্যে) সম্পূর্ণ ফাইল। পুরোপুরি বৈধ অক্ষরগুলি দেখানোর জন্য খুব ভালভাবে ডিজাইন করা একটি ফাইল।

পরীক্ষা

দ্বিতীয় ফাইলটি ইউটিএফ -8 পাঠকরা একটি ভাল কাজ করছেন তা নিশ্চিত করার জন্য কয়েকটি সীমান্ত ক্ষেত্রে চেষ্টা করার জন্য ডিজাইন করা হয়েছে। এটিতে অনেকগুলি অক্ষর রয়েছে যা একটি ' ' দেখানোর কারণ হতে পারে। তবে ব্যবহারের জন্য অন্য উত্তরের প্রস্তাবনা (নির্বাচিত একটি) fileএই ফাইলটির সাথে পুরোপুরি ব্যর্থ। কেবল একটি শূন্য বাইট ( \0) যা প্রযুক্তিগতভাবে বৈধ ASCII বৈধ) এবং একটি \x7fবাইট (দেল - মুছুন) অপসারণ করলে (যা স্পষ্টতই একটি ASCII অক্ষরও হয়) কমান্ডের জন্য সমস্ত ফাইলকে বৈধ করে তুলবে file:

$ cat UTF-8-test.txt | tr -d '\0\177' > a.txt
$ file a.txt 
a.txt: Non-ISO extended-ASCII text, with LF, NEL line terminators

নয় fileসনাক্ত করতে ব্যর্থ অনেক ভুল অক্ষর, কিন্তু সনাক্ত এবং প্রতিবেদন এটি একটি UTF-8 এনকোড ফাইল যে ব্যর্থ হয়।

এবং হ্যাঁ, fileইউটিএফ -8 এনকোডযুক্ত পাঠ্যটি সনাক্ত এবং প্রতিবেদন করতে সক্ষম:

$ echo "ééakjfhhjhfakjfhfhaéá" | file -
/dev/stdin: UTF-8 Unicode text

এছাড়াও, file1 থেকে 31 ব্যাপ্তির বেশিরভাগ নিয়ন্ত্রণের অক্ষরকে ASCII হিসাবে রিপোর্ট করতে ব্যর্থ হয়েছে It এটি ( file) কিছু রেঞ্জের প্রতিবেদন করেছে data:

$ printf '%b' "$(printf '\\U%x' {1..6})" | file -
/dev/stdin: data

অন্যদের হিসাবে ASCII text:

$ printf '%b' "$(printf '\\U%x' 7 {9..12})" | file -
/dev/stdin: ASCII text

মুদ্রণযোগ্য চরিত্রের সীমা হিসাবে (নতুন লাইনের সাথে):

$ printf '%b' "$(printf '\\U%x' {32..126} 10)" | file -
/dev/stdin: ASCII text

তবে কিছু রেঞ্জের কারণে অদ্ভুত ফলাফল হতে পারে:

$ printf '%b' "$(printf '\\U%x' {14..26})" | file -
/dev/stdin: Atari MSA archive data, 4113 sectors per track, starting track: 5141, ending track: 5655

প্রোগ্রামটি fileপাঠ্য সনাক্ত করার কোনও সরঞ্জাম নয়, তবে এক্সিকিউটেবল প্রোগ্রাম বা ফাইলগুলিতে যাদু সংখ্যা সনাক্ত করতে।

ব্যাপ্তিগুলি fileসনাক্ত করে এবং আমি যে অনুরূপ প্রকারের প্রতিবেদন করেছি তা হ'ল:

  • একটি বাইট মান, বেশিরভাগ আসকি:

    {1..6} {14..26} {28..31} 127   :data
    {128..132} {134..159}          :Non-ISO extended-ASCII text
    133                            :ASCII text, with LF, NEL line terminators
    27                             :ASCII text, with escape sequences
    13                             :ASCII text, with CR, LF line terminators
    8                              :ASCII text, with overstriking
    7 {9..12} {32..126}            :ASCII text
    {160..255}                     :ISO-8859 text
    
  • উত -8 এনকোডেড রেঞ্জ:

    {1..6} {14..26} {28..31} 127   :data
    27                             :ASCII text, with escape sequences
    13                             :ASCII text, with CR, LF line terminators
    8                              :ASCII text, with overstriking
    7 {9..12} {32..126}            :ASCII text
    {128..132} {134..159}          :UTF-8 Unicode text
    133                            :UTF-8 Unicode text, with LF, NEL line terminators
    {160..255}                     :UTF-8 Unicode text
    {256..5120}                    :UTF-8 Unicode text
    

একটি সম্ভাব্য সমাধান নীচে রয়েছে।


পূর্ববর্তী উত্তর

আপনি যে চরিত্রটি পোস্ট করছেন তার ইউনিকোড মানটি হ'ল:

$ printf '%x\n' "'�"
fffd

হ্যাঁ, এটি একটি ইউনিকোড চরিত্র 'রিপ্লেসমেন্ট চরিত্র' (ইউ + এফএফএফডি) । এটি পাঠ্যটিতে পাওয়া কোনও অবৈধ ইউনিকোড অক্ষর প্রতিস্থাপন করতে ব্যবহৃত একটি অক্ষর । এটি একটি "ভিজ্যুয়াল এইড", বাস্তব চরিত্র নয়। অবৈধ ইউনিকোডে অক্ষরযুক্ত প্রতিটি পূর্ণ লাইন সন্ধান এবং তালিকাবদ্ধ করতে:

grep -axv '.*' out.txt 

তবে আপনি যদি কেবল কোনও অক্ষরই অবৈধ কিনা তা সনাক্ত করতে চান তবে ব্যবহার করুন:

grep -qaxv '.*' out.txt; echo $?

ফলাফলটি যদি 1ফাইলটি পরিষ্কার থাকে তবে অন্যথায় শূন্য হবে 0


আপনি যদি যা জিজ্ঞাসা করছিলেন তা হ'ল: চরিত্রটি কীভাবে সন্ধান করতে হয় , তবে এটি ব্যবহার করুন:

➤ a='Basically, if the file "out.txt" contains "�" anywhere in the file I'
➤ echo "$a" | grep -oP $(printf %b \\Ufffd)
�

অথবা যদি আপনার সিস্টেমটি সঠিকভাবে UTF-8 পাঠ্য প্রক্রিয়া করে, কেবল:

➤ echo "$a" | grep -oP '�'
�

ওএমজি আপনাকে অনেক ধন্যবাদ grep -axv '.*' !! আমি আমার পাঠ্য ফাইলগুলিতে কয়েকটি খারাপ চরিত্রের সাথে লড়াই করেছি এবং কীভাবে এ্যাম্যাকগুলিতে সেগুলি ঠিক করব, এক দশক বা দুই দশক ধরে !!!
nealmcb

3

এই প্রথম দিকের উত্তরটি মূল পোস্টের জন্য ছিল যা ছিল:

কীভাবে ইউনিকোডের জন্য গ্রেপ করবেন a ব্যাশ স্ক্রিপ্টে

if grep -q "�" out.txt
    then
        echo "working"
    else
        cat out.txt  fi

মূলত, যদি "out.txt" ফাইলটিতে ফাইলের যে কোনও জায়গায় " " থাকে তবে আমি এটি "कार्यरत" প্রতিধ্বনিত করতে চাই এবং যদি "আউট.টেক্সট" ফাইলটি ফাইলের কোথাও " " না থাকে তবে আমি চাই এটি বিড়াল to.txt

চেষ্টা

grep -oP "[^\x00-\x7F]"

if .. thenনিম্নলিখিত হিসাবে একটি বিবৃতি সহ :

if grep -oP "[^\x00-\x7F]" file.txt; then
    echo "grep found something ..."
else
    echo "Nothing found!"
fi

Explanation💡:

  • -P, --perl-regexp: PATTERN একটি পার্ল নিয়মিত প্রকাশ
  • -o, --only-matching: PATTERN- র সাথে মেলে একটি লাইনের অংশটি দেখান
  • [^\x00-\x7F] একটি একক নন-এএসসিআইআই চরিত্রের সাথে মেলে এমন একটি রেজেক্স।
  • [[:ascii:]] - একটি একক ASCII চরের সাথে মেলে
  • [^[:ascii:]] - একটি একক নন-এএসসিআইআই চরের সাথে মেলে

ভিতরে bash

LC_COLLATE=C grep -o '[^ -~]' file

3
কেউ ইংরাজী না বলার সাথে সাথেই এটি ভঙ্গ হবে (একটি মিথ্যা ইতিবাচক) ...
কেভিন

বা যদি কেউ car লা কার্টে, ইমোজি, পোকেমন, বা অন্য কোনও বিষয়কে কঠোরভাবে 7 বিএসটিআইএসআইতে সীমাবদ্ধ না রাখার চেষ্টা করে। 09 0 এ 0 ডি (ট্যাব, লাইনফিড, ক্যারেজ রিটার্ন) ব্যতীত 00-1F এ যে কোনও কিছুর জন্য আরও ভাল চেহারা।
আলকারো

এটি একটি খুব ভারী খারাপ ধারণা। এটি ASCII ব্যাপ্তির উপরে যে কোনও বৈধ ইউনিকোড চরকে প্রত্যাখ্যান করবে , মিলিয়ন বৈধ অক্ষরের চেয়ে সামান্য কিছু বেশি। অ্যামেজিং। চেষ্টা করুন: printf '%b' "$(printf '\\U%x' {128..131})" | grep -oP "[^\x00-\x7F]"আপনার কোডটি বাতিল করে দেয় মাত্র 4 টি বৈধ ইউনিকোড অক্ষর। :-(
ইসহাক

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