সব মিলিয়ে আউটপুট দেওয়ার জন্য গ্রেপকে বিশ্বাস করুন, কেবল ম্যাচের সাথে নয়


121

বলুন আমার কাছে নিম্নলিখিত ফাইল রয়েছে:

$ cat test

test line 1
test line 2
line without the search word
another line without it
test line 3 with two test words
test line 4

ডিফল্টরূপে, grepপ্রতিটি লাইনে অনুসন্ধান শব্দটি অন্তর্ভুক্ত করে:

$ grep test test

test line 1
test line 2
test line 3 with two test words
test line 4

--colorপ্যারামিটারটি পাস করা এটি grepঅনুসন্ধানের সাথে মেলে এমন লাইনের অংশটি হাইলাইট করে তুলবে, তবে এটি এখনও কেবলমাত্র এমন রেখাগুলি প্রত্যাবর্তন করে যা এক্সপ্রেশন ধারণ করে। grepউত্স ফাইলে প্রতিটি লাইন আউটপুট পাওয়ার কোনও উপায় কি তবে মিলগুলি হাইলাইট করে?

এটি সম্পাদন করার জন্য আমার বর্তমানের ভয়ঙ্কর হ্যাক (কমপক্ষে এমন কোনও ফাইলের সাথে 10000+ টানা লাইন নেই যা কোনও মিল নেই) হ'ল:

$ grep -B 9999 -A 9999 test test

দুটি কমান্ডের স্ক্রিনশট

যদি grepএটি সম্পাদন করতে না পারে, তাহলে কি আর কোনও কমান্ড-লাইন সরঞ্জাম একই কার্যকারিতা সরবরাহ করে? আমি ফিড করেছি ack, তবে মনে হয় এটির কোনও বিকল্প নেই।


1
এর সম্ভাব্য ক্রস সাইটের সদৃশ: স্ট্যাকওভারফ্লো.com/ প্রশ্নগুলি / 9881601/… শীর্ষ উত্তর দুটি ক্ষেত্রে একই the
সিরো সান্তিলি 事件 改造 中心 法轮功 六四

1
আপনি সর্বদা এটির -C 9999জায়গায় ব্যবহার করতে পারেন -A 9999 -B 9999:grep -C 9999 pattern file
নিও

উত্তর:


181
grep --color -E "test|$" yourfile

আমরা এখানে যা করছি তা $প্যাটার্ন এবং পরীক্ষার প্যাটার্নের সাথে $মিলছে , সম্ভবত টেস্টের প্যাটার্নটি রঙ পেতে রঙিন করার মতো কিছু নেই। -Eশুধু বর্ধিত Regex ম্যাচিং চালু করে।

আপনি সহজেই এর বাইরে কোনও ফাংশন তৈরি করতে পারেন:

highlight () { grep --color -E "$1|$" "${@:1}" ; }

14
এটাই দুর্দান্ত!
gvkv

3
আর একটি ফাংশন হিসাবে: highlight () { grep --color -E "$1|$" $2 ; }। ব্যবহার:highlight test yourfile
স্টিফান লাসিউইস্কি

2
@ স্টেফানলাসিউস্কি: "$2"এছাড়াও উদ্ধৃত করা উচিত।
ডেনিস উইলিয়ামসন

6
আরও ভাল হতে পারে: highlight () { grep --color -E "$1|$" "$@" }যা তাদের নাম এবং একাধিক ফাইলের মধ্যে শ্বেত স্পেসযুক্ত ফাইলগুলিকে মঞ্জুরি দেয় ।
মাইক ডিসিমোন

15
@ মাইকডিসিমোন - তবে "$1"এটি ফাইলগুলিতেও থাকবে। ব্যবহারhighlight () { grep --color -E "$1|$" "${@:1}" }
ক্রিস ডাউন

39
ack --passthru --color string file

উবুন্টু এবং ডেবিয়ানদের জন্য, এসির পরিবর্তে আক্ক-গ্রেপ ব্যবহার করুন

ack-grep --passthru --color string file

1
ওহ, এটি ম্যান পেজে বেশ স্পষ্টতই; আমি অন্ধ. ধন্যবাদ
মাইকেল মরোজেক

গ্রাপের জন্য প্যাটার্নটি স্পষ্টভাবে নির্দিষ্ট করে দেওয়া যেতে পারে --regexp string; ack / ack-grep সমতুল্য--match string
রোববার্ব

ack --passthruপার্ল দিয়ে অনুকরণ করতে :grep_passthrough () { ! perl -ne "print; \$e ||= /$@/; END{{exit \$e}}"; }
লুকাস সিমন

ack --passthruস্রোতেও কাজ করে! উদাহরণস্বরূপ,ifconfig | ack --passthru inet
হনকবয়

12

আরেকটি উপায় এই কাজ করতে সঠিকভাবে এবং portably সঙ্গে grep(গৃহীত উত্তর হিসেবে আবর্তনে সঙ্গে দুই regexes ব্যবহার পাশে) নাল প্যাটার্ন (এবং যথাক্রমে নাল স্ট্রিং) মাধ্যমে হয়।
এটি স্ট্যান্ডার্ড অনুযায়ী , উভয় -Eএবং -Fস্যুইচগুলির সাথে সমানভাবে ভালভাবে কাজ করা উচিত :

-E
    Match using extended regular expressions. 
    [...] A null ERE shall match every line.

এবং

-F
    Match using fixed strings.
    [...] A null string shall match every line.

সুতরাং এটি কেবল দৌড়ানোর বিষয়

grep -E -e '' -e 'pattern' infile

এবং যথাক্রমে

grep -F -e '' -e 'string' infile

1
বা ঠিক grep -F -e '' -e 'string'
স্টাফেন চেজেলাস

এটি আমার জন্য জিএনইউ গ্রেপ ২.২৫, ব্যস্তবক্স গ্রেপ এবং উত্তরাধিকারী সরঞ্জাম সরঞ্জামের সাহায্যে কাজ করে।
স্টাফেন চেজেলাস

ঠিক আছে, আমার খারাপ, seq 3 | grep -F -e '' -e 2আউটপুট কেবল ২.২27-এ (এবং ২.২,, তবে ২.২25 নয় এবং গিটের মাথায় নয়) does শুধুমাত্র সাথে -F(ই বা ছাড়া বা নেই)) IOW, কেবল 2.26 এবং 2.27 এর মধ্যে বাগ রয়েছে এবং কেবল -F রয়েছে।
স্টাফেন চেজেলাস 26'17

নোট যেটি seq 3 | grep -F -e '' -e '' -e 2
২.২27-এর

1
এই উত্তরে প্রদত্ত পদ্ধতিটি সহজ, সঠিক এবং বেশ দ্রুত বলে মনে হচ্ছেআপনি যেমনটি বলেছেন , এটি স্বয়ংক্রিয়ভাবে কাজ করে -F, কী কী চরিত্রগুলি উপস্থিত হয় তা নিয়ে চিন্তা করার প্রয়োজনকে হ্রাস করে string। আপনি উল্লেখ করতে চাইতে পারেন --color; এই উত্তরটি যেমন পৃষ্ঠায় ভেসে ওঠে (যখন ভোটের মাধ্যমে দেখা হবে), অন্য উত্তরগুলির আগে আরও লোকেরা এটি পড়া শেষ করতে পারে।
এলিয়াহ কাগন

11

আমি এই জাতীয় জিনিসের জন্য নিম্নলিখিত ফাংশন ব্যবহার করি:

highlight () {
    perl -pe "s/$1/\e[1;31;43m$&\e[0m/g"
}

অভ্যন্তরীণভাবে এটি দেখতে একদৃষ্ট কুরুচিপূর্ণ, এটি দুর্দান্ত এবং সহজেই ব্যবহারযোগ্য, যেমন:

cat some_file.txt | highlight some_word

বা, আরও কিছুটা বাস্তব-বিশ্বের উদাহরণের জন্য:

tail -f console.log | highlight ERROR

পরিবর্তন করে - তুমি কিছু রং আপনি চান (আমি ভালো না নিশ্চিত, grep সঙ্গে কঠিন হতে হতে পারে) পরিবর্তন করতে পারেন 1এবং 31এবং 43(পরে \e[) বিভিন্ন মান। কোড ব্যবহার করতে হয় সব ওভার জায়গা , কিন্তু এখানে একটি দ্রুত ইন্ট্রো দেওয়া হলঃ 1 bolds টেক্সট, 31লাল করে তোলে, এবং 43একটি হলুদ পটভূমিতে দেয়। 32বা 33বিভিন্ন বর্ণ হতে পারে, এবং 44বা 45বিভিন্ন ব্যাকগ্রাউন্ড হবে: আপনি ধারণা পাবেন। এমনকি 5যদি আপনি খুব ঝোঁক থাকেন তবে আপনি এটি জ্বলজ্বলও করতে পারেন (এ দিয়ে )।

এটি কোনও বিশেষ পার্ল মডিউল ব্যবহার করে না, এবং পার্ল প্রায় সর্বব্যাপী, তাই আমি এটি অন্য কোথাও কাজ করার আশা করব। গ্রেপ দ্রবণটি খুব চালাক, তবে - গ্রেপ-রঙের স্যুইচটি সর্বত্র পাওয়া যায় না। উদাহরণস্বরূপ, আমি কেবল সোলারিস বক্সে চলমান বাশ, এবং অন্য একটি চলমান ksh, এবং আমার স্থানীয় ম্যাক ওএস এক্স মেশিনে zsh চালিয়ে এই সমাধানটি চেষ্টা করেছি। সব ঠিক কাজ করে। সোলারিস grep --colorঅবশ্য এ সমস্যার সমাধান করেছিলেন।

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

যেহেতু আমি মনে করি না আমি করেছি কি কখনো একটি ইউনিক্স বাক্সে কাজ করা হয়নি পার্ল ইনস্টল করা আছে (এমবেডেড-টাইপ সিস্টেম, Linksys রাউটার ছাড়া এবং এই ধরনের) আমি বলতে চাই এই প্রায় কাছাকাছি একটি সর্বজনীন ব্যবহারযোগ্য সমাধান ।


3

গ্রেপ ব্যবহারের পরিবর্তে, আপনি কম ব্যবহার করতে পারেন:

less file

এর মতো অনুসন্ধান করুন: /pattern Enter

এটা হবে:

  1. প্রথম মিলের লাইনে স্ক্রোল করুন
  2. সেখান থেকে শুরু প্রতিটি লাইন আউটপুট
  3. সমস্ত ম্যাচ হাইলাইট করুন

পরবর্তী ম্যাচের লাইনে স্ক্রোল করতে: n

পূর্ববর্তী মিলের লাইনে স্ক্রোল করতে: N

টগল হাইলাইট করতে: Esc u

এছাড়াও আপনি চাইলে হাইলাইটিং রঙটি পরিবর্তন করতে পারেন।


2

আপনি চেষ্টা করতে পারেন:

perl -MTERM::ANSIColor -nle '/pattern/ ? print colored($_, 'color') : print' test

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


2

ripgrep

ripgrepএর --passthruপরামিতি ব্যবহার করুন :

rg --passthru pattern file.txt

এটি দ্রুততম গ্রেপিংয়ের সরঞ্জামগুলির মধ্যে একটি , যেহেতু এটি রাস্টের রেজেক্স ইঞ্জিনের শীর্ষে নির্মিত যা সন্ধানকে খুব দ্রুত করতে সীমাবদ্ধ অটোমেটা , সিমডি এবং আক্রমণাত্মক আক্ষরিক অনুকূলকরণ ব্যবহার করে।

--passthru - মিল এবং অ-মিল উভয় লাইন মুদ্রণ করুন।

অনুরূপ প্রভাব অর্জনের আর একটি উপায় হ'ল খালি স্ট্রিংয়ের সাথে মেলে আপনার প্যাটার্নটি পরিবর্তন করে। উদাহরণস্বরূপ, আপনি যদি অনুসন্ধান করে থাকেন rg fooতবে rg "^|foo"পরিবর্তে ব্যবহার করে অনুসন্ধান করা প্রতিটি ফাইলের প্রতিটি লাইন নির্গত হয়, তবে কেবল ফু এর ঘটনাগুলি হাইলাইট করা হবে। এই পতাকাটি প্যাটার্নটি পরিবর্তন করার প্রয়োজন ছাড়াই একই আচরণ সক্ষম করে।


1

জিএনইউ গ্রেপের জন্য এটি করার অনেক সহজ উপায় আছে তবে আমি মনে করি না এটি পোর্টেবল (যেমন, বিএসডি গ্রেপ):

একটি পাইপে:

cat <file> | grep --color=always -z <query>

একটি ফাইলে:

grep --color=always -z <query> <file>

ক্রেডিট এখানে সাইরাস এর উত্তর


1
এটি আপনার (এবং সাইরাস) ভাবার মতো উত্তম উত্তর নয়। এটি সম্পূর্ণ ফাইলটিকে একক লাইন হিসাবে বিবেচনা করার প্রভাব ফেলে। অতএব, (1) যদি ফাইলটি খুব বড় হয়, এ মেমোরির পরিমাণ চলমান একটি সম্ভাবনা হতে পারে, এবং (2) ফাইলটি প্যাটার্ন ধারণ করে না এ সব , তারপর কিছুই আউটপুট হবে। এবং আপনি ঠিক বলেছেন; এটি সর্বজনীনভাবে উপলব্ধ নয়। (তবে তারপরেও --colorতা মানসম্মত নয়))
জি ম্যান

এটি গ্রেপের কোন সংস্করণে সমর্থিত? গ্রেপ 2.5.4-তে, -জেড উপলব্ধ মনে হয় না ...
অ্যালেক্স

1

এখনও অবধি দেওয়া উত্তরগুলির মধ্যে কোনও পোর্টেবল সমাধান সরবরাহ করে না।

এখানে একটি পোর্টেবল 1 শেল ফাংশন আমি ইতিমধ্যে পোস্ট ডুপ্লিকেট প্রশ্ন অ মান সরঞ্জাম বা সাথে উপলব্ধ করা অ মান এক্সটেনশন প্রয়োজন হয় না যেমন একটি বদ্ধ মধ্যে perl, ack, ggrep, gsed, bashএবং পছন্দগুলি কিন্তু শুধুমাত্র একটি POSIX শেল এবং POSIX বাধ্যতামূলক ইউটিলিটি প্রয়োজন sedএবং printf:

grepc()
{
  pattern=$1
  shift
  esc=$(printf "\033")
  sed 's"'"$pattern"'"'$esc'[32m&'$esc'[0m"g' "$@"
}

আপনি এটি সেভাবে ব্যবহার করতে পারেন:

grepc string_to_search [file ...]

সেড কমান্ড আর্গুমেন্টে এই কোডগুলির মধ্যে একটি ব্যবহার করে হাইলাইট রঙটি সামঞ্জস্য করা যেতে পারে (এখানে 32m সবুজ হয়ে উঠছে):

30m black
31m red
33m yellow
34m blue
35m magenta
36m cyan
37m white
7m reverse video

1 যতক্ষণ আপনার টার্মিনাল এএনএসআই রঙগুলি অব্যাহতি ক্রম সমর্থন করে supports


0

একটি sedসংস্করণ, উভয় bashএবং এ কাজ করে ash

#highlight
hsed(){
    local pattern="$1"
    shift
    local r=`echo -e '\e'[31m`
    local c=`echo -e '\e'[0m`
    sed "s:${pattern//:/\:}:$r\0$c:g" "$@"
}

0

ওপি জিজ্ঞাসা করেছিল grep, এবং এটিই আমি স্বীকার করি ; তবে sedরেকর্ডের জন্য সমস্যাটি সমাধান করার জন্য কঠোর চেষ্টা করার পরেও এটির সাথে একটি সহজ সমাধান এখানে দেওয়া হয়েছে:

sed $'s/main/\E[31m&\E[0m/g' testt.c

অথবা

cat testt.c | sed $'s/main/\E[31m&\E[0m/g'

আঁকবে mainলাল।

  • \E[31m : লাল রঙের সূচনা ক্রম
  • \E[0m : রঙিন চিহ্ন সমাপ্ত
  • & : মেলে নিদর্শন
  • /g : সমস্ত শব্দ এক লাইনে, কেবল প্রথম নয়
  • $'string' পালানো অক্ষরের ব্যাখ্যা সহ বাশ স্ট্রিংগুলি

সংক্রান্ত , grep , এটি ব্যবহার করে কাজ করে ^পরিবর্তে (লাইনের শুরু) $(লাইন শেষে)। উদাহরণ:

egrep "^|main" testt.c

এবং এই ক্রেজি ওরফেটি দেখানোর জন্য যে আমি প্রস্তাব দিই না , আপনি এমনকি খোলার উদ্ধৃতিটি দিতে পারেন:

alias h='egrep -e"^|'
h main" testt.c
cat testt.c | h main"

সব কাজ! :) আপনি উদ্বিগ্নতাটি বন্ধ করতে ভুলে গেলে চিন্তা করবেন না, বাশ আপনাকে একটি "ধারাবাহিক রেখা চরিত্র" দিয়ে মনে রাখবে।

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