বহু রঙিন গ্রেপ


30

আমি প্রতিটি গ্রেপ কমান্ডের ফলাফলটি ভিন্ন বর্ণের হাইলাইট করার চেষ্টা করছি। আমি এটির মতো একটি লাইন দিয়ে ম্যানুয়ালি এটি করতে পারি:

ls -l GREP_COLORS='mt=01;32' grep c | GREP_COLORS='mt=01;31' grep o | GREP_COLORS='mt=01;34' grep n | GREP_COLORS='mt=01;36' grep f

প্রতিটি cচরিত্র সবুজতে হাইলাইট হবে এবং প্রতিটি oচরিত্রকে লাল, ইত্যাদিতে হাইলাইট করা হবে ...

এই উদাহরণটি কাজ করার জন্য আপনাকে সর্বদা --color=alwaysআপনার গ্রেপ কমান্ডের মধ্যে রয়েছে তা নিশ্চিত করতে হবে । আমি এটি আমার .bashrc এতক্ষণে সেট করে রেখেছি গ্রেপটিতে সবসময় রঙ থাকবে:

export GREP_OPTIONS='--color=always'


আমি যেটি সম্পাদন করার চেষ্টা করছি তা হ'ল একটি উপকরণ দিয়ে এই কার্যকারিতাটি মোড়ানো যাতে আমি কেবল একবার কল করতে পারি grepএবং GREP_COLORSপ্রতিবার একটি আলাদা মান পেতে পারি। আমি প্রতিটি নতুন পাইপযুক্ত গ্রেপের জন্য একাধিক শেলের বিবেচনা বুঝতে পেরেছি এবং এগুলি ইতিমধ্যে ব্যবহৃত হয়েছে তা বোঝাতে কিছু ফাইল (প্রতিটি রঙের জন্য একটি) তৈরি করে আমি এটি ব্যবহার করার চেষ্টা করছি।

আমি কিছু চেষ্টা করেছি তবে আশ্চর্যের বিষয়, এটি "সেরা" হিসাবে কাজ করে বলে মনে হচ্ছে। আমার মধ্যে এটি আছে .bashrc:

alias mg="mygrep"
mygrep(){
    # define possible colors
    COLORS=("01;32" "01;31" "01;34" "01;36")
    COUNTER=0
    NUM=0
    # as long as the color has already been used, keep searching
    while [ -f /home/lior/Desktop/mygrep_$NUM ]; do
        # get a random index
        let NUM=`shuf --input-range=0-$(( ${#COLORS[*]} - 1 )) | head -1`
        wait ${!}
        $(( COUNTER+=1 ))
        if [ "$COUNTER" -ge ${#COLORS[@]} ]; then
            # remove all color locks
            rm /home/lior/Desktop/mygrep_*
            wait ${!}
        fi
    done
    # mark this color as used
    touch /home/lior/Desktop/mygrep_$NUM
    wait ${!}

    # lets go!
    GREP_COLORS="mt=${COLORS[$NUM]}" grep "$@"
}

আমি এই উপনামটি এর মতো ব্যবহার করছি:

ll | mg c | mg o | mg n | mg f

ফলাফলগুলি বেশ দুর্দান্ত। তবে কিছু ত্রুটি রয়েছে যা প্রতিবারের চেয়ে কিছুটা আলাদা। এখানে বেশ কয়েকটি স্ক্রিনশট রয়েছে:

মনে হচ্ছে শেল প্রতিটি পাইপ কমান্ড দিয়ে চলেছে, পূর্ববর্তী ফাংশনটি এখনও এটি কার্যকর করে নি। এটি এমন ফাইলগুলি সরানোর চেষ্টা করে যা আর অস্তিত্বহীন। এই অন্যান্য command not foundত্রুটিগুলি কোথা থেকে এসেছে তা আমি নিশ্চিত নই ।

আপনি দেখতে পাচ্ছেন, waitফাইল ম্যানিপুলেশনটি সম্পূর্ণ করার চেষ্টা করার জন্য আমি কয়েকটি কমান্ড রেখেছি তবে এটি খুব ভালভাবে কাজ করছে বলে মনে হচ্ছে না। আর একটি জিনিস যা আমি ইতিমধ্যে চেষ্টা করেছি /dev/shmতা হ'ল শেয়ার্ড মেমোরি ব্যবহার করা তবে এটি একই রকম ফলাফল পেয়েছে।

আমি কীভাবে ফলাফল পেতে চাই?

বিঃদ্রঃ:

আমি এমন উত্তরগুলির সন্ধান করছি যা কেবল গ্রেপ কমান্ডটি মোড় করে দেয় কারণ এতে প্রচুর কার্যকারিতা রয়েছে যা আমি পাইপগুলির মধ্যে অন্যান্য যুক্তি সন্নিবেশ করানোর এবং ব্যবহার করতে চাইছিলাম, তাই আমি একবারে সমস্ত অনুসন্ধানের পদ সরবরাহ করতে চাই না। আমি অন্যান্য "গ্রেপ লাইক" সরঞ্জামগুলিও খুঁজছি না। @Terdon এর জন্য দুঃখিত যারা ইতিমধ্যে দুর্দান্ত একটি পার্ল পরামর্শ পোস্ট করেছেন।


আপনার প্রথম উদাহরণটি বাকী অংশে যা ব্যাখ্যা করছেন, তার সাথে মেলে না just
বার্নহার্ড

@ বার্নহার্ড আপনার অর্থ কী তা আমি বুঝতে পারি না .. আমার উদ্দেশ্য হল আমার উপনামটি পাইপিং ব্যবহার করে একটি বৃহত্তর কমান্ডের অংশ হিসাবে ব্যবহার করা ... দয়া করে আমাকে জানান যে আপনি কোন দ্বন্দ্বের কথা বলছেন ...
লিক্স

আমি ভেবেছিলাম আপনি পাইপের বাইরেও আপনার উপনামটি ব্যবহার করতে চেয়েছিলেন। যাইহোক, আপনার প্রথম উদাহরণটি আমার পক্ষে কাজ করে না। আপনি চেষ্টা করেছেন alias mg="mygrep; grep"?
বার্নহার্ড

@ বার্নহার্ড - আমি একটি উবুন্টু 12.04 বাক্সে কাজ করছি। কিছুটা পার্থক্য থাকলে আমি অবাক হব না ... আমি আপনার পরামর্শটি চেষ্টা করেছিলাম, তার সাথে সমস্যাটি এটি mygrep;একটি নতুন কমান্ডে পরিণত হয় এবং ডেটা স্ট্রিমটি হারিয়ে যায়। এর থেকে আগত পাইপ গ্রেপ না lsহয়ে পাস হবে mygrep;। কমপক্ষে এটি আমি এটি বুঝতে পারি।
লিক্স

@ বার্নহার্ড - আহ .. আমি মনে করি আমি জানি কেন এটি আপনার পক্ষে কার্যকর হয়নি। --color=alwaysআপনার সমস্ত গ্রেপ কমান্ডে আপনার রয়েছে তা নিশ্চিত করা দরকার । আমি আমার বিশ্বব্যাপী সেট .bashrc। আমি পোস্টে এটি সম্পাদনা করেছি।
লিক্স

উত্তর:


6

এখানে একটি ভিন্ন পদ্ধতির। আমার কাছে একটি সামান্য পার্ল স্ক্রিপ্ট রয়েছে যা আমি ইতিমধ্যে অন্য উত্তরে পোস্ট করেছি যা ব্যবহারকারীর বিভিন্ন রঙে প্রদত্ত নিদর্শনগুলিকে হাইলাইট করবে। স্ক্রিপ্টের কিছুটা সংশোধিত সংস্করণ এর মতো কাজ করবে grep:

#!/usr/bin/env perl
use Getopt::Std;
use strict;
use Term::ANSIColor; 

my %opts;
getopts('hic:l:',\%opts);
    if ($opts{h}){
      print<<EoF; 
Use -l to specify the pattern(s) to highlight. To specify more than one 
pattern use commas. 

-l : A Perl regular expression to be colored. Multiple expressions can be
     passed as comma separated values: -l foo,bar,baz
-i : makes the search case sensitive
-c : comma separated list of colors;

EoF
      exit(0);
    }

my $case_sensitive=$opts{i}||undef;
my @color=('bold red','bold blue', 'bold yellow', 'bold green', 
       'bold magenta', 'bold cyan', 'yellow on_blue', 
       'bright_white on_yellow', 'bright_yellow on_red', 'white on_black');
if ($opts{c}) {
   @color=split(/,/,$opts{c});
}
my @patterns;
if($opts{l}){
     @patterns=split(/,/,$opts{l});
}
else{
    $patterns[0]='\*';
}

# Setting $| to non-zero forces a flush right away and after 
# every write or print on the currently selected output channel. 
$|=1;

while (my $line=<>) 
{ 
    my $want=0;
    for (my $c=0; $c<=$#patterns; $c++){
    if($case_sensitive){
        if($line=~/$patterns[$c]/){
           $line=~s/($patterns[$c])/color("$color[$c]").$1.color("reset")/ge;
           $want++;
        }
    }
    else{
        if($line=~/$patterns[$c]/i){
          $line=~s/($patterns[$c])/color("$color[$c]").$1.color("reset")/ige;
          $want++;
        }
      }
    }
print STDOUT $line if $want>0;
}

যদি আপনি সেই স্ক্রিপ্টটিকে cgrepঅন্য কোথাও সংরক্ষণ করেন PATHএবং এটিকে সম্পাদনযোগ্য করে তোলেন, তবে আপনি 10 টি আলাদা আলাদা প্যাটার্ন নির্দিষ্ট করতে পারবেন, যার প্রতিটি আলাদা রঙে মুদ্রিত হবে:

এখানে চিত্র বর্ণনা লিখুন

$ cgrep -h
Use -l to specify the pattern(s) to highlight. To specify more than one 
pattern use commas. 

-l : A Perl regular expression to be colored. Multiple expressions can be
     passed as comma separated values: -l foo,bar,baz
-i : makes the search case sensitive
-c : comma separated list of colors;

5

grepপাইপের প্রতিটি অনুরোধ পৃথক শেলের মধ্যে চলে, তাই আপনাকে তাদের মধ্যে কিছুটা অবস্থা পাস করতে হবে। নিম্নোক্ত সমাধানটি হ'ল একটি অপরিশোধিত উপায় হ'ল এমন একটি ফাইল যা রঙ সূচক এবং একটি লক ফাইল রাখে যা একই সাথে একই কলগুলি একই মান পড়বে না তা নিশ্চিত করে:

#!/usr/bin/env bash
color_index_file=~/.gitcolor
color_index_lock_file=/tmp/$(basename $0)

colors=()
for index in {31..34}
do
    colors+=("01;$index")
done

until mkdir "$color_index_lock_file" 2>/dev/null
do
    :
done

color_index=$(($(cat "$color_index_file" || echo 0) + 1))

if [[ $color_index -ge ${#colors[@]} ]]
then
    color_index=0
fi

printf "$color_index" > "$color_index_file"
rmdir "$color_index_lock_file"

GREP_COLORS="mt=01;${colors[$color_index]}" grep --color=always "$@"

পরীক্ষা করে ধরে নেওয়া যে আপনি নিজের অনুলিপিটির নাম দিয়েছেন cgrepএবং এটি আপনারতে রেখেছেন PATH:

echo foobarbaz | cgrep foo | cgrep bar | cgrep baz

কেবলমাত্র চলকগুলি যা সত্যই রক্ষণাবেক্ষণ করা দরকার তা হ'ল COLOR_INDEXএবং GREP_COLORS। আমি সাফল্য ছাড়াই ফাংশন শেষে এগুলি রফতানি করার চেষ্টা করেছি। আপনি কি বোঝাতে চেয়েছিলেন? কেবল আছে export VAR, তাই না?
লিক্স

ওহ - এবং হ্যাঁ COLOR_TOGGLE। এটি ধরার জন্য ধন্যবাদ :)
লিক্স

1
@ l0b0 রফতানি আমার পক্ষে কার্যকর হয় না, আপাতত ডাউনওয়েট করতে হবে যতক্ষণ না এটি সত্যিই প্রশ্নের উত্তর দেয়।
বার্নহার্ড

@ বার্নহার্ড এটি কি আপনার জন্য কাজ করে?
l0b0

আপনার ইনপুট জন্য ধন্যবাদ! আমি আপনার grep "$@"পরামর্শটি অন্তর্ভুক্ত করেছি - এটি ফাংশনটি চালানোর জন্য এবং তারপরে গ্রেপ করার পরে ওরফে বাছাই করা হয়েছে।
লিক্স

1

আপনি যদি নিয়মিত এক্সপ্রেশন দিয়ে ভাল হন তবে আপনি grc এবং grcat পরীক্ষা করতে চাইতে পারেন। grc কল grcat।

grcat কনফিগারেশন ফাইলগুলি ব্যবহার করে যেখানে আপনি প্রতিটি রঙে প্রদর্শিত হতে পারে পাঠ্যের সাথে মেলে নিয়মিত প্রকাশ করতে পারেন। এটিতে আরও অনেকগুলি বিকল্প রয়েছে। এটি সিস্টেম লগ ফাইলগুলিকে রঙিন করতে ডিফল্ট।

আপনার চূড়ান্ত স্ক্রিপ্টের জন্য আপনি যা মনে করছেন তার উপর নির্ভর করে আপনি কেবল একটি কমান্ড দিয়ে নিজের আউটপুটকে রঙিন করতে সক্ষম হতে পারেন।

কৌশলটি আপনার ডেটা উত্সের প্রতিটি "ক্ষেত্রের" জন্য সঠিকভাবে রেজিক্সগুলি নির্দিষ্ট করে দিচ্ছে। আপনার ডেটা কাঠামোতে তুলনামূলকভাবে অভিন্ন হলে এটি অনেক সহজ হবে।

গতবার আমি চেষ্টা করেছিলাম, আমি খুব বেশি দূরে পেলাম না, তবে আমার আর একবারে যেতে হবে কারণ আমি তখনকার চেয়ে রেজিজেসে কিছুটা ভাল ছিলাম।

এছাড়াও টিপুট কমান্ড রয়েছে যা সরাসরি আপনার টার্মিনাল ডিভাইসে তথ্য (রঙ পরিবর্তনের মতো) প্রেরণে ব্যবহার করা যেতে পারে।

উভয় পন্থা নীচের পোস্ট দ্বারা আচ্ছাদিত করা হয়। এটি ফাইন্ড কমান্ড সম্পর্কে কথা বলে তবে এটি কোনও কমান্ডের আউটপুটে প্রয়োগ করা যেতে পারে।

রঙিন FIND আউটপুট?

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