রঙিন গ্রেপ আউটপুট: GREP_OPTIONS টির উপকরণ নয়


10

আমি রঙিন আউটপুট চাই grep

.... কিন্তু

  • কৌশল 1: GREP_OPTIONS। তবে এটি অবমূল্যায়ন করা হয়। Http://www.gnu.org/software/grep/manual/html_node/Enomot-Variables.html দেখুন
  • স্ট্রাজি 2: GREP_COLORS প্রথম দর্শনে সমাধানের মতো দেখায় তবে এটি কিছু আলাদা করে।
  • কৌশল 3: ওরফে। এটি এর জন্য কার্যকর হয় না find ... | xargs grep, যেহেতু xargs কোনও উপকরণের মূল্যায়ন করে না।
  • কৌশল 4: একটি সহজ মোড়ক স্ক্রিপ্ট লিখুন। না, আমি মনে করি এটি অত্যন্ত নোংরা এবং এটি সমাধানের চেয়ে আরও ঝামেলা করে।
  • কৌশল 5: উত্স কোডটি প্যাচ করুন
  • কৌশল 6: গ্রেপ বিকাশকারীদের সাথে যোগাযোগ করুন, GREP_OPTIONS এর প্রতিস্থাপনের জন্য বলুন
  • কৌশল নিস-এবং-ইজি: ... এটি অনুপস্থিত। আমার কাছে কোন তথ্য নাই.

কীভাবে সমাধান করবেন?

সাহায্য করার চেষ্টা করার জন্য আপনাকে ধন্যবাদ!

... তবে আমি অনুগ্রহ দিতে পারি না

আমাকে অভদ্র, অহংকারী, অপমানজনক, আপত্তিজনক বলুন ...

আমি কেবল কাজের আশেপাশে দেখি - কোনও সমাধান নেই। কোন উত্তর প্রশ্ন সন্তুষ্ট।

চেষ্টা করার জন্য তোমাকে ধন্যবাদ.


1
"সত্যই উত্তর নয়" হিসাবে একটি র‌্যাপার স্ক্রিপ্ট (আপনার কৌশল 4) ব্যবহার করার জন্য আপনি দুটি পরামর্শ প্রত্যাখ্যান করেছেন। এটি সম্পর্কে "নোংরা", "ঝামেলা" বা "সত্যই কোনও উত্তর নয়" কি তা বর্ণনা করতে পারেন? সম্ভবত এটি একটি পৃথক সমস্যা যা চারপাশে কাজ করা যেতে পারে।
জিগ্লিগনাগ

2
কৌশল 5 হ'ল উত্স কোডটি প্যাচ করা হয়েছে এবং এতে সেট করা color_optionআছে2 ...
don_crissti 16'17

2
@ জিগলি নাগা এখানে আমার ব্যাখ্যাটি কেন একটি মোড়ক স্ক্রিপ্ট সমাধান নয়। আমাদের দল বেশ কয়েকটি সার্ভার পরিচালনা করে। এই মুহুর্তে হাজারেরও কম তবে গণনা বাড়ছে। হ্যাঁ, আমরা কনফিগারেশন পরিচালনা ব্যবহার করি এবং তাদের সকলের কাছে একটি স্ক্রিপ্ট স্থাপন করা সহজ হবে be তবে আমি চাই জিনিসগুলি সহজ এবং সরল হোক (দলে নতুন সদস্যদের কথা ভাবেন I আমি তাদের গুলিয়ে ফেলতে চাই না)। --colorবিকল্প ইতিমধ্যে মূল্য আছে auto। আমি কেবল জানি না কেন আপনি এটি ডিফল্টরূপে সক্রিয় করতে পারবেন না।
গেটলি

আপনার কৌশল 4 বা 5 ব্যবহার করা উচিত - আমি ন্যূনতম ড্যাশ / শ স্ক্রিপ্ট ( exec grep --color=auto "$@") এর সাথে বিকল্প 4, grepcবা আলাদা নামের ( বা colorgrep) ব্যবহার করে কৌশল 4 পছন্দ করব । এতে অবহেলিত ওভারহেড (এবং রানটাইমের সময় কোনও অতিরিক্ত সমবর্তী প্রক্রিয়া নেই)। আপনি তাদের "যথেষ্ট সহজ নয়" হিসাবে চিহ্নিত করার কারণটি হ'ল এটি যে আপনি এই বৈশিষ্ট্যটি কার্যকর করার জন্য (তুলনামূলকভাবে সামান্য) এককালীন প্রচেষ্টা ব্যয় করতে যথেষ্ট পরিমাণে ব্যবহার করেন না এবং আপনার জন্য এটির জন্য অন্য কেউ চাইছেন। এ কারণে আপনার পোস্ট করা উত্তরগুলিতে আপনার "সত্যই উত্তর নয়" মন্তব্যগুলি বেশ অভদ্র।
নামমাত্র প্রাণী

1
@ নামিমনিমাল হ্যাঁ, আপনি ঠিক "সত্যই উত্তর নয়" অসভ্য মনে হচ্ছে। আমি নেটিভ স্পিকার নই। কোন শব্দ (একই বার্তা স্থানান্তর) ভাল হবে?
guettli

উত্তর:


13

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


বেশিরভাগ বিতরণে, (সাধারণ) বা (ওপেনসুএসই, সম্ভবত অন্যরা) grepইনস্টল করা থাকে এবং ডিফল্টটিতে এর আগে বা থাকে । এর অর্থ হ'ল আপনি যদি এটি দিয়ে তৈরি করেন/bin/usr/binPATH/usr/local/bin/bin/usr/bin/usr/local/bin/grep

#!/bin/sh
exec /bin/grep --color=auto "$@"

যেখানে /bin/shএকটি POSIX সামঞ্জস্যপূর্ণ আপনার বন্টন, সাধারণত ব্যাশ বা ড্যাশ দ্বারা উপলব্ধ শেল হয়। যদি grepথাকে /usr/bin, তবে এটি তৈরি করুন

#!/bin/sh
exec /usr/bin/grep --color=auto "$@"

এই স্ক্রিপ্টের ওভারহেড ন্যূনতম। execবিবৃতি মানে স্ক্রিপ্টটি অনুবাদক দ্বারা প্রতিস্থাপিত হয় grepবাইনারি; এর অর্থ grepহ'ল মৃত্যুদন্ড কার্যকর করার সময় শেলটি স্মৃতিতে থাকে না । সুতরাং, একমাত্র ওভারহেড হ'ল স্ক্রিপ্ট ইন্টারপ্রেটারের একটি অতিরিক্ত সম্পাদন, অর্থাৎ প্রাচীর ঘড়ির সময় একটি ছোট বিলম্ব ten বিলম্বিতা মোটামুটি ধ্রুবক (কেবলমাত্র পৃষ্ঠার ক্যাশে রয়েছে grepএবং shতা ইতিমধ্যে এবং আই / ও ব্যান্ডউইথ কতটা উপলভ্য রয়েছে তার উপর নির্ভর করে) এবং এটি কতক্ষণ grepচালায় বা কত ডেটা প্রক্রিয়া করে তার উপর নির্ভর করে না ।

সুতরাং, যে দীর্ঘতরতা, মানে ওভারহেডটি মোড়ক স্ক্রিপ্ট দ্বারা যুক্ত হয়?

এটির জন্য, উপরের স্ক্রিপ্টটি তৈরি করুন এবং চালান

time /bin/grep --version
time /usr/local/bin/grep --version

আমার মেশিনে, প্রাক্তনটি 0.005s রিয়েল টাইম নেয় (প্রচুর সংখ্যক রানের জুড়ে), যেখানে আধুনিক সময়টি 0.006s সময় নেয়। সুতরাং, আমার মেশিনে মোড়ক ব্যবহারের ওভারহেড প্রতি অনুরোধে 0.001s (বা তার চেয়ে কম) হয়।

এটা তুচ্ছ।

আমি এ সম্পর্কে "নোংরা" কিছুই দেখতে ব্যর্থ হই কারণ অনেকগুলি সাধারণ অ্যাপ্লিকেশন এবং ইউটিলিটি একই পন্থা ব্যবহার করে। আপনার মেশিনে এ জাতীয় তালিকা দেখতে /binএবং /usr/binকেবল চালান

file /bin/* /usr/bin/* | sed -ne 's/:.*shell script.*$//p'

আমার মেশিন অন, উপরে আউটপুট অন্তর্ভুক্ত egrep, fgrep, zgrep, which, 7z, chromium-browser, ldd, এবং xfig, আমি বেশ প্রায়ই ব্যবহার করে। আপনার পুরো বিতরণটি "রেন্ডার স্ক্রিপ্ট" এর উপর নির্ভর করার জন্য "নোংরা" না বিবেচনা না করা থাকলে আপনার এ জাতীয় মোড়ক স্ক্রিপ্টগুলি "নোংরা" বিবেচনা করার কোনও কারণ নেই।


সমস্যার ক্ষেত্রে যেমন একটি র‍্যাপার স্ক্রিপ্টের কারণ হতে পারে:

শুধুমাত্র মানুষের ব্যবহারকারী (যেমন স্ক্রিপ্ট থেকে ভিন্ন), grep সংস্করণ যে রঙ সমর্থন যদি আউটপুট টার্মিনাল হয় ডিফল্ট, তারপর মোড়কের স্ক্রিপ্ট নামকরণ করা যাবে ব্যবহার করে থাকেন colorgrepবা cgrepবা যাই হোক না কেন ওপি হইয়া সূচিত করা হবে।

এটি সমস্ত সম্ভাব্য সামঞ্জস্যের বিষয়গুলি এড়িয়ে চলে, কারণ আচরণের ক্ষেত্রে grepকোনও পরিবর্তন হয় না।


grepমোড়ক স্ক্রিপ্টের সাহায্যে বিকল্পগুলি সক্ষম করা , তবে এমন কোনও উপায়ে যাতে কোনও নতুন সমস্যা এড়ানো যায়:

সমর্থন না করা GREP_OPTSথাকলেও আমরা কাস্টমকে সমর্থন করার জন্য সহজেই মোড়ক স্ক্রিপ্টটি পুনরায় লিখতে পারি GREP_OPTIONS(এটি ইতিমধ্যে অবনমিত রয়েছে)। এইভাবে ব্যবহারকারীরা কেবল export "GREP_OPTIONS=--color=auto"তাদের প্রোফাইলে যুক্ত বা অনুরূপ করতে পারেন । /usr/local/bin/grepতারপর

#!/bin/sh
exec /bin/grep $GREP_OPTIONS "$@"

মনে রাখবেন চারপাশে কোনও উদ্ধৃতি নেই $GREP_OPTIONS, যাতে ব্যবহারকারীরা একাধিক বিকল্প নির্দিষ্ট করতে পারেন।

আমার সিস্টেমে, খালি time /usr/local/bin/grep --versionদিয়ে GREP_OPTIONSবা সাথে চালানো GREP_OPTIONS=--color=auto, মোড়ক স্ক্রিপ্টের পূর্ববর্তী সংস্করণের মতোই দ্রুত; অর্থাত্ সাধারণত প্লেইনের তুলনায় এক মিলিসেকেন্ড বেশি সময় নেয় grep

এই শেষ সংস্করণটি হ'ল আমি ব্যক্তিগতভাবে ব্যবহারের জন্য প্রস্তাব দিই।


সংক্ষেপে, ওপির কৌশল 4:

  • aready grepবিকাশকারীদের দ্বারা সুপারিশ করা হয়

  • বাস্তবায়নের জন্য তুচ্ছ (দুটি লাইন)

  • তুচ্ছ ওভারহেড রয়েছে (এই বিশেষ ল্যাপটপে প্রতিটি অনুরোধের জন্য এক মিলিসেকেন্ড অতিরিক্ত বিলম্বিতা; প্রতিটি মেশিনে সহজেই যাচাই করা যায়)

  • GREP_OPTSসমর্থন যুক্ত করে এমন একটি মোড়ক স্ক্রিপ্ট হিসাবে প্রয়োগ করা যেতে পারে (অবহেলিত / অসমর্থিত প্রতিস্থাপন করতে GREP_OPTIONS)

  • (হিসাবে colorgrep/ cgrep) প্রয়োগ করা যেতে পারে যা স্ক্রিপ্ট বা বিদ্যমান ব্যবহারকারীদের মোটেই প্রভাবিত করে না

কারণ এটি এমন একটি প্রযুক্তি যা লিনাক্স বিতরণে ইতিমধ্যে ব্যাপকভাবে ব্যবহৃত হয়, এটি একটি সাধারণ কৌশল এবং "নোংরা" নয়।

যদি একটি পৃথক মোড়ক ( colorgrep/ cgrep) হিসাবে প্রয়োগ করা হয় তবে এটি নতুন সমস্যা তৈরি করতে পারে না কারণ এটি grepআচরণে মোটেই প্রভাব ফেলে না । GREP_OPTSসমর্থন যুক্ত করে GREP_OPTS=--color=autoএমন একটি মোড়ক স্ক্রিপ্ট হিসাবে প্রয়োগ করা হলে , ব্যবহারের ঠিক একই ঝুঁকি রয়েছে (বিদ্যমান স্ক্রিপ্টগুলির সাথে অস্থির সমস্যা) যা মূল প্রবাহকে ডিফল্ট হিসাবে যুক্ত করে --color=auto। সুতরাং, এটি "এটি সমাধানের চেয়ে আরও বেশি সমস্যা তৈরি করে" মন্তব্য সম্পূর্ণ ভুল: কোনও অতিরিক্ত সমস্যা তৈরি হয় না।


3

আপনি প্রথম কৌশলটির সাথে যে ডকুমেন্টেশন সরবরাহ করেছেন তাতে বলা হয়েছে:

পরিবর্তে একটি উপনাম বা স্ক্রিপ্ট ব্যবহার করুন। উদাহরণস্বরূপ, গ্রেপ যদি '/ usr / bin' ডিরেক্টরিতে থাকে তবে আপনি P HOM / Bin আপনার PATH এ প্রিন্ট করতে পারেন এবং একটি এক্সিকিউটেবল স্ক্রিপ্ট তৈরি করতে পারেন: হোম / বিন / গ্রেপ নিম্নোক্ত:

#! /bin/sh
export PATH=/usr/bin
exec grep --color=auto --devices=skip "$@"

সুতরাং যদি উপনামটি আপনার পক্ষে অসম্ভব, তবে রাবার স্ক্রিপ্টটি একমাত্র উপায়।


এটি কৌশল 4 ... আসলে কোনও উত্তর নয়।
গেটলি

3

কারণ GREP_OPTIONSপরিবর্তনশীল অবচিত এটি যখন কারণ সমস্যার থাকে হয় grepএকটি স্ক্রিপ্ট কোথাও বলা হয় এবং স্ক্রিপ্ট বিকল্প বিকল্প পরিবর্তনশীল থেকে আসা সঙ্গে কাজ করে না। আপনি যদি একটি মোড়ক স্ক্রিপ্ট লিখে থাকেন grepতবে আপনার একই সমস্যা রয়েছে, যদি না আপনি এটি আলাদা নাম দেন

$ cat ~/bin/cgrep
#!/bin/sh
exec grep --color=always "$@"
$ find  -exec cgrep  {} +

বিকল্পভাবে, আপনার পছন্দসই বিকল্পগুলি একটি ভেরিয়েবলে সঞ্চয় করুন। Zsh ব্যতীত অন্যান্য শেলগুলিতে, বিকল্পগুলি ওয়াইল্ডকার্ড অক্ষর ( \[*?) ধারণ করে থাকলে এটি জটিল but

cgrep=(grep --color=always)
find  -exec $cgrep  {} +

নোট করুন যে জিএনইউ এবং বিএসডি গ্রেপ একটি ডিরেক্টরি ট্রিকে পুনরাবৃত্তভাবে প্রক্রিয়া করতে পারে যা বেশিরভাগ সময়ের findসাথে একত্রে প্রয়োজনীয়তা হ্রাস করে grep


1
এটি কৌশল 4 ... আসলে কোনও উত্তর নয়।
গেটলি

@ গুয়েটলি, এটি সঠিক উত্তর। যদি আপনি কোনও ভিন্ন আচরণের মতো একটি কমান্ড চান grepযা আপনার আলাদা নামের একটি কমান্ড প্রয়োজন, অন্যথায় যদি আপনি একই নামটি রাখেন তবে আপনি মূল / মানক আচরণের প্রত্যাশাকারী স্ক্রিপ্টগুলি ভেঙে ফেলবেন। এটি সবচেয়ে পরিষ্কার এবং অতিরিক্ত সমস্যার কারণ নয় ।
স্টাফেন চেজেলাস

@ স্টাফেনচাজেলাস হ্যাঁ আপনি ঠিক বলেছেন। আপনার দৃষ্টিকোণ অনুযায়ী এটি সঠিক উত্তর।
গেটলি

1

সবচেয়ে সহজ জিনিসটি একটি উপনাম (কৌশল 3) ব্যবহার করা। আপনি যদি xargsকমান্ডটি সত্যিই যত্নবান হন তবে আপনি এটি এখনও ব্যাশ ফাংশন দিয়ে ওভাররাইড করতে পারেন।

alias grep='grep --color'
xargs() {
    local args
    for ((i=1; i<=$#; i++))
    do
            if [[ "-E -L -P -I -s -d" == *"${!i}"* ]]; then
                    ((i=i+1))
            elif [[ ${!i:0:1} != "-" ]]; then
                    if [[ ${!i} == "grep" ]]; then
                            args="--color"
                    fi
                    /usr/bin/xargs ${@:1:i} $args ${@:i+1}
                    return;
            fi
    done
}

তবে এটি একটি র‌্যাপার কমান্ড ব্যবহার করার চেয়ে ভাল নয় যা grepদলটির প্রস্তাবিত সমাধান বলে মনে হয় :

/usr/local/bin/grep:

#!/bin/bash
/bin/grep --color "$@"

আমার বিনীত মতে, আপনার grepবিকাশকারী দলের সাথে যোগাযোগ করতে হবে তাদের GREP_OPTIONSভেরিয়েবলের একটি সহজ প্রতিস্থাপনের জন্য জিজ্ঞাসা করতে যা grepকিছু পরিবেশের পরিবর্তনশীল অনুযায়ী রঙকে সক্ষম করে ।

তাদের পক্ষে ডিফল্টরূপে colorবিকল্পটি সক্ষম করা বা যখন GREP_COLORSসেট করা থাকে তা বেশ সহজ হবে ।


1
"... আপনাকে গ্রেপ বিকাশকারী দলের সাথে যোগাযোগ করা উচিত ..." এর জন্য আপনাকে ধন্যবাদ। এটি আমাকে ইতিবাচক প্রতিক্রিয়া দেয়। এখন আমি জানি যে আমিই একমাত্র মনে করি না যে এখানে কিছু অনুপস্থিত মনে করে।
guettli

আমি আপনার মন্তব্য যুক্ত করেছি "... আপনার প্রশ্নের গ্রেট বিকাশকারী দলের সাথে যোগাযোগ করা উচিত ..." কৌশল হিসাবে 6। এখন পর্যন্ত এটি আমার প্রিয় উত্তর is
guettli

0

এটি @ নোমিনালঅ্যানিমালের শীর্ষ উত্তর থেকে সমাধান তবে grep: ...সতর্কবার্তার পরিবর্তে (পরিবর্তে /bin/grep: ...) এর সাথে সমাধানটি :

#!/bin/bash
exec -a grep /bin/grep --color=auto "$@"

আমি জানি কীভাবে র‌্যাপার লিখতে হয়। একটি মোড়ক এই প্রসঙ্গে সমাধান নয়।
guettli

@ গুয়েটলি ওয়েল, উত্তরটির অর্থ আপনার পরিস্থিতিটি সুনির্দিষ্টভাবে মোকাবেলা করার জন্য নয় ... মন্তব্যে যদি উত্তরগুলির মতো একই ফর্ম্যাট বৈশিষ্ট্য থাকে তবে এটি একটি মন্তব্য হবে। (এবং আমার অনুরূপ সম্পাদনাগুলি মূল লেখক বা অন্য কিছু দ্বারা প্রত্যাশিত হিসাবে প্রত্যাখ্যান করা হয়েছিল)) আপনার পরিস্থিতি হিসাবে, আমি মনে করি আপনার প্রশ্নের যথাযথ আক্ষরিক উত্তর হ'ল: অন্য একটি "কৌশল নিস-এবং-সহজ" বিদ্যমান নেই।
কিরিল বুলিগিন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.