রঙ অনুসারে কমান্ডের ফিল্টার আউটপুট


13

আমি একটি ইউটিলিটি চালাচ্ছি যা এর আউটপুট ফিল্টার করার কোনও উপায় দেয় না। আউটপুটটির পাঠ্যের কোনও কিছুই ইঙ্গিত দেয় না যে একটি নির্দিষ্ট ফাংশন ব্যর্থ হয়েছে তবে এটি লাল দেখায়। আউটপুটটি এত দীর্ঘ যে শেষে যখন এটি কিছু # টির ত্রুটি জানায় আমি যেখানে আছি ত্রুটিটি ঘটেছিল তা দেখতে আমি সর্বদা স্ক্রোল করতে পারি না।

আমি কীভাবে রেডহীন পাঠ্য ফিল্টার করব?

সুডোকোড:

dolongtask | grep -color red

সম্পাদন করা

কমান্ড পাশাপাশি অন্যান্য রং আউটপুট এবং আমি ফিল্টার করতে সক্ষম হতে হবে আউট সব পাঠ্য করা হয় না লাল। এছাড়াও টেক্সট রঙিন বহুজাতিক।


1
আমি স্পষ্টতই জিজ্ঞাসা করার জন্য ক্ষমা চাইছি - তবে সমস্ত আউটপুট চালু আছে >&1? আমি বলতে চাইছি, লাল জিনিসগুলি দূরে যায় না আপনি 2>/dev/null, তাই না?
মাইকজারভেজ

উত্তর:


15

রঙ স্যুইচিং পাঠ্যের মধ্যে এম্বেড সিকোয়েন্সগুলির মাধ্যমে করা হয় । অবিচ্ছিন্নভাবে, প্রোগ্রামগুলি এএনএসআই অব্যাহতি সিকোয়েন্সগুলি জারি করে , কারণ এটি আজকাল প্রায় সমস্ত টার্মিনাল সমর্থন করে।

ফোরগ্রাউন্ডের রঙটিকে লাল রঙে পরিবর্তন করতে পালানোর ক্রমটি হ'ল \e[31m, যেখানে \eএকটি এস্কেপ চরিত্র (অষ্টাল 033, হেক্সাডেসিমাল 1 বি, যা ইএসসি হিসাবে পরিচিত ^[এবং অন্যান্য বিভিন্ন উপাধি) নির্ধারণ করে। 30-39 পরিসরের নম্বরগুলি অগ্রভাগের রঙ নির্ধারণ করে; অন্যান্য সংখ্যা বিভিন্ন বৈশিষ্ট্য সেট করে। \e[0mসমস্ত বৈশিষ্ট্য তাদের ডিফল্ট মানটিতে পুনরায় সেট করে। cat -vপ্রোগ্রামটি কী প্রিন্ট করে তা যাচাই করার জন্য এটি চালান , এটি \e[0;31mপ্রথমে সমস্ত বৈশিষ্ট্যগুলি পুনরায় সেট \e[3;31করতে , বা তাত্পর্যগুলি স্যুইচ করতে (যা অনেক টার্মিনাল সমর্থন করে না) ব্যবহার করতে পারে some

Ksh, bash বা zsh এ, আপনি $'…'কোটসের ভিতরে ব্যাকস্ল্যাশ পলায়ন সক্ষম করতে ব্যবহার করতে পারেন , যা আপনাকে $'\e'পালানোর অক্ষর পেতে টাইপ করতে দেয় । নোট করুন যে তারপরে আপনাকে যে কোনও ব্যাকস্ল্যাশ যেতে হবে দ্বিগুণ করতে হবে grep। ইন /bin/sh, আপনি "$(printf \\e)"একটি আক্ষরিক পালানোর অক্ষর ব্যবহার বা টাইপ করতে পারেন ।

জিএনইউ grep -oবিকল্পের সাহায্যে নিম্নলিখিত স্নিপেটটি লাল টেক্সট ফিল্টার করে, ধরে নেওয়া হয় যে এটি পালানোর ক্রম দিয়ে শুরু \e[31mহয়, হয় উভয় \e[0mবা \e[30mএকই লাইনের সাথে শেষ হয় এবং এতে এম্বেডেড পালানোর অনুক্রম থাকে না।

grep -Eo $'\e\\[31m[^\e]*\e\\[[03]?m'

নীচের awkস্নিপেট লাল পাঠ্য নিষ্কাশন করে, এমনকি এটি বহুগুণেও থাকে।

awk -v RS='\033' '
    match($0, /^\[[0-9;]*m/) {
        color = ";" substr($0, 2, RLENGTH-2) ";";
        $0 = substr($0, RLENGTH+1);
        gsub(/(^|;)0*[^03;][0-9]*($|;)/, ";", color);
        red = (color ~ /1;*$/)
    }
    red'

এখানে রঙের পরিবর্তনকারী কমান্ডগুলি ধরে রাখার একটি প্রকরণ রয়েছে, আপনি যদি একাধিক রং (এখানে লাল এবং ম্যাজেন্টা) ফিল্টার করছেন তবে তা কার্যকর হতে পারে।

awk -v RS='\033' '
    match($0, /^\[[0-9;]*m/) {
        color = ";" substr($0, 2, RLENGTH-2) ";";
        printf "\033%s", substr($0, 1, RLENGTH);
        $0 = substr($0, RLENGTH+1);
        gsub(/(^|;)0*[^03;][0-9]*($|;)/, ";", color);
        desired = (color ~ /[15];*$/)
    }
    desired'

অজানা সমাধানটি আমার পক্ষে কাজ করেছিল। আউটপুটে রঙ ধরে রাখার কোনও উপায়?
km6zla

@ ওজিসি-নিক আপনি অল-রেড আউটপুট চান? printf '\e[31m'; awk …; printf '\e[0m'
গিলস

আউটপুট ধরে রাখার জন্য আমি যে কোনও রঙের জন্য ফিল্টার করছি for
km6zla

@ ওজিসি-নিক আমার সম্পাদনা দেখুন।
গিলস 'খারাপ হয়ে যাওয়া বন্ধ করুন'

6

আপনি কন্ট্রোল অক্ষরের জন্য গ্রেপ চেহারা পেতে পারেন, যার মধ্যে কয়েকটি টার্মিনালে সুন্দর রঙ করার জন্য দায়ী।

dolongtask | grep '[[:cntrl:]]'

উদাহরণস্বরূপ, এটি গ্রেপ হিসাবে একটি লাল "পরীক্ষা" প্রতিধ্বনিত করে, যা এটি নিয়ন্ত্রণ অক্ষর দ্বারা বেষ্টিত হওয়ার কারণে এটি খুঁজে পায়:

$ echo -e '\033[00;31mtest\033[00m' | grep --color=none '[[:cntrl:]]'
test     <-- in red

কেবল --color=noneগ্রেফটি ম্যাচ আউটপুটে তার নিজস্ব রঙিন প্রয়োগ করে না তা নিশ্চিত করার জন্য, তবে পুরো লাইনটি বিশ্বস্ততার সাথে প্রিন্ট করে যাতে নিয়ন্ত্রণ অক্ষরগুলি শেল দ্বারা ব্যাখ্যা করা যায়।


খুশী হলাম। আমি ভাবছি যদি কেউ আরও এগিয়ে যেতে পারে এবং বিশেষত লালটির জন্য পরীক্ষা করতে পারে grep -E $'\033\[0?[01];31m.+?\033\[0?0m'বা grep -Po '\033\[0?[01]+;31m\K.+?(?=\033\[0?0m)'করতে পারে?
স্টিল্ড্রাইভার

আপনার পরামর্শ মতো আমি রেজিওসিস নিয়ে আসতে শুরু করেছিলাম, তবে তাদের কাজ করার আগে আমি হোঁচট খেয়েছি [[:cntrl:]]। আমি আপনার পরীক্ষা করেছি এবং তারা আমার জন্য কাজ করে, যেমন। লাল মিলে এবং অন্য রঙের সাথে মেলে ব্যর্থ।
সাওয়ান্তো

দুর্দান্ত কাজ করে তবে যে কোনও রঙের সাথে মিলবে। আমি প্রশ্নটিতে এটি উল্লেখ করিনি তবে আরও অনেকগুলি রঙও আউটপুট এবং আমি কেবল লাল জিনিস দেখতে চাই। সহজ এবং কার্যকরী কোডের জন্য +1।
km6zla
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.