নেতিবাচক ম্যাচিং গ্রেপ ব্যবহার করে (ম্যাচ লাইনগুলিতে ফু থাকে না)


988

আমি এই কমান্ডটির বাক্য গঠনটি তৈরির চেষ্টা করছি:

grep ! error_log | find /home/foo/public_html/ -mmin -60

বা:

grep '[^error_log]' | find /home/baumerf/public_html/ -mmin -60

নামযুক্ত ব্যতীত আমাকে পরিবর্তন করা সমস্ত ফাইল দেখতে হবে error_log

আমি এটি সম্পর্কে এখানে পড়েছি , তবে কেবলমাত্র একটি- notরিজেক্স প্যাটার্ন পেয়েছি ।


13
[^ ত্রুটি_লগ] কখনই কোনওভাবেই কাজ করবে না, [] চর ক্লাস, সাধারণভাবে রেজিএক্সপেক্ট নেতিবাচক প্যাটার্নে ভাল হয় না (যদি না ইঞ্জিন নেতিবাচক বর্ণনীর প্রয়োগ করে)।
জাপ

উত্তর:


1753

grep -v তোমার বন্ধু:

grep --help | grep invert  

-v, --invers-ম্যাচটি অ-ম্যাচিং লাইন নির্বাচন করুন

সম্পর্কিত -L(পরিপূরক -l) পরীক্ষা করে দেখুন ।

-এল, - ফাইলস-ম্যাচ ছাড়াই কেবল কোনও মিল নেই এমন ফাইলের নাম মুদ্রণ করুন


124
একাধিক (নেতিবাচক) ম্যাচের জন্য -eবিকল্পটি ব্যবহার করা যেতে পারে grep -v -e 'negphrase1' -e 'negphrase2'
উল্লেখযোগ্য

31
@ বাবকেন-বর্ধনিয়ান এর মন্তব্যের অনুরূপ - একাধিক ম্যাচে যোগদানের জন্য পাইপ ব্যবহার করতে সক্ষম যেমনgrep -v 'negphrase1|negphrase2|negphrase3'
নিকোলাস অ্যাডামস

13
শেষ মন্তব্যটি একই রকম নয় কারণ এটি এমন জিনিসগুলির জন্য অনুসন্ধান করবে যা উভয়টির চেয়ে মিলছে না। যেমন এটির সাথে মেলে তবে অন্যটির সাথে এটি এখনও মুদ্রিত। অ-অনুরূপ স্ট্রিং দিয়ে এটি উভয়ভাবেই ব্যবহার করে দেখুন
ইভান ল্যাংলোইস

7
@ ইভানল্যাংলোইস - গ্রেপকে -Eকাজগুলি ব্যবহার করে বর্ধিত নিয়মিত অভিব্যক্তি হিসাবে প্যাটার্নটি ব্যাখ্যা করতে বাধ্য করছে , grep -vE 'negphrase1|negphrase2|negphrase3'
জ্লেমিনি

1
@ ওলেহর্স্টেট, আমি মনে করি আমার আগের মন্তব্যে আপনার পরিস্থিতিটি আমি ভুল বুঝেছি, নিম্নলিখিতটি আপনি যা খুঁজছেন তা হতে পারে grep "" /dev/null * | grep foo | grep -v bar | cut -d: -f1 | sort -u( কেন প্রথম গ্রেপ? সবসময় একটি উপায় আছে :))
মোটি

139

আপনি awkএই উদ্দেশ্যে ব্যবহার করতে পারেন , যেহেতু এটি আপনাকে আরও জটিল পদ্ধতিতে আরও পরিষ্কার পদ্ধতিতে সঞ্চালন করতে দেয়:

লাইনগুলি নেই foo:

awk '!/foo/'

রেখাগুলি fooনাও রয়েছে bar:

awk '!/foo/ && !/bar/'

তন্ন তন্ন ধারণকারী লাইনস fooকিংবা barযা পক্ষে য়থেষ্ট foo2বা bar2:

awk '!/foo/ && !/bar/ && (/foo2/ || /bar2/)'

ইত্যাদি।


2
এটি আসলে বেশ দুর্দান্ত। লজিকাল অপারেটরগুলির সাথে গ্রুপ regexp করার জন্য আপনাকে সম্পূর্ণ অজস্র ভাষা শিখতে হবে না। এই উত্তরের জন্য ধন্যবাদ!
পিটার টি।

1
ঠিক আমি যা খুঁজছিলাম, অনেক ধন্যবাদ।
mmrs151

13

আপনার ক্ষেত্রে, আপনি সম্ভবত গ্রিপ ব্যবহার করতে চান না, তবে ফাইন্ড কমান্ডের পরিবর্তে একটি নেতিবাচক ধারা যুক্ত করুন, উদাহরণস্বরূপ

find /home/baumerf/public_html/ -mmin -60 -not -name error_log

আপনি যদি নামের সাথে ওয়াইল্ডকার্ডগুলি অন্তর্ভুক্ত করতে চান তবে আপনাকে সেগুলি থেকে বাঁচতে হবে, যেমন প্রত্যয়। লগ সহ ফাইলগুলি বাদ দিতে:

find /home/baumerf/public_html/ -mmin -60 -not -name \*.log
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.