গ্রেপ রেজেক্সে স্ট্রিং নেই


181

আমি grepএকটি সিসলোগ ফাইলের বিপরীতে চেক করতে রেজেক্স প্যাটার্নগুলির একটি তালিকা দিচ্ছি । তারা সাধারণত একটি আইপি ঠিকানা এবং লগ এন্ট্রি মিলছে;

grep "1\.2\.3\.4.*Has exploded" syslog.log

এটি কেবলমাত্র "1\.2\.3\.4.*Has exploded"লুপের অংশটি যাচ্ছি তার মতো নিদর্শনগুলির একটি তালিকা , যাতে আমি উদাহরণস্বরূপ "-v" পাস করতে পারি না।

আমি উপরের বিপরীতটি করার চেষ্টা করে বিভ্রান্ত হয়েছি, একটি নির্দিষ্ট আইপি ঠিকানা এবং ত্রুটির সাথে একটি নয় লাইন মেলে "! 1.2.3.4। । মিলতে না পারার জন্য আমার অবশ্যই একটি আইপি অন্তর্ভুক্ত করতে সক্ষম হব

আমি স্ট্যাকওভারফ্লোরগুলিতে বিভিন্ন অনুরূপ পোস্ট দেখেছি তবে তারা রেজেক্স প্যাটার্নগুলি ব্যবহার করে যা আমার সাথে কাজ করার মতো মনে হয় না grepgrepদয়া করে কেউ কি একটি কাজের উদাহরণ প্রদান করতে পারেন ?

আপডেট: এটি স্ক্রিপ্টের মতো ঘটছে;

patterns[1]="1\.2\.3\.4.*Has exploded"
patterns[2]="5\.6\.7\.8.*Has died"
patterns[3]="\!9\.10\.11\.12.*Has exploded"

for i in {1..3}
do
 grep "${patterns[$i]}" logfile.log
done

আপনি কি বোঝাতে চেয়েছেন যে আপনি কখনও কখনও কোনও প্যাটার্নটি মেলাতে চান, তবে অন্য সময়গুলি একটি নির্দিষ্ট প্যাটার্ন বাদে সমস্ত কিছুতে মিলতে চান ? (এটি একটি বিজোড় প্রয়োজন মতো মনে হয়, তবে যাই হোক না কেন)। সেক্ষেত্রে, আপনি নিদর্শনগুলির দুটি পৃথক তালিকার উপরে পুনরাবৃত্তি করবেন না কেন?
বেরবাজে

আচ্ছা আমি রেজেক্স সম্পর্কে খুব জ্ঞানী নই; আমি "হেটে বিস্ফোরিত হয়েছি" এর জন্য গ্রেপ করতে চাই না কারণ আমি প্রতিটি লগিং ডিভাইস সম্পর্কে এটি জানতে চাই না, তাই কোনও বিবৃতিতে আমি "হেট বিস্ফোরিত" এবং 9.10.11.12 এর জন্য কোনওভাবে গ্রেপ করতে পারি?
jwbensley

যদি আপনার অবশ্যই এটি একটি বিবৃতিতে অবশ্যই করা উচিত, নীলের পরামর্শ অনুসারে নেতিবাচক লুকবাইন্ডগুলি যাওয়ার উপায়। আমার মন্তব্য সেখানে দেখুন।
বেরবাজে

@ নীলের উত্তর অনুসারে পিসিআরই-স্টাইলের রেজেক্স ম্যাচিং এবং একটি নেতিবাচক বর্ণনামূলক বক্তব্য ব্যবহার করুন: পিসিআরইতে patterns[3]="\!9\.10\.11\.12.*Has exploded"পরিবর্তন patterns[3]="(?<!9\.10\.11\.12).*Has exploded"এবং grep "${patterns[$i]}" logfile.logপরিবর্তনগুলি grep -P "${patterns[$i]}" logfile.logডিফল্টরূপে আরও মেটাচ্যাকার্টর ধরে নেয়, তাই পালানো কিছু লোকের সাথে অন্য মিলের এক্সপ্রেশন থেকে অপসারণের প্রয়োজন হতে পারে।
কোডেক্স 24

উত্তর:


340

grepgrep -vবিপরীত মেলে, না। আপনার যদি "A এর সাথে মেলে তবে B নয়" প্রয়োজন হয় তবে আপনি সাধারণত পাইপ ব্যবহার করেন:

grep "${PATT}" file | grep -v "${NOTPATT}"

এটি উল্লেখ করার সাথে সাথে এটি একটি লুপের মাঝখানে চলে যাচ্ছে এবং আমি কেবল প্যাটার্নটি গ্রেপ করতে যাচ্ছি যাতে আমি উল্লিখিতভাবে "-v" ব্যবহার করতে পারি না। আমি কেবলমাত্র প্যাটার্নগুলির একটি তালিকা লুপ করছি এবং গ্রেপ এ যাচ্ছি।
jwbensley

1
আপনি প্রকৃতপক্ষে ব্যবহার করতে পারেন -vএবং আপনি এটি একটি লুপে ব্যবহার করতে পারেন। আপনার সীমাবদ্ধতা সম্পর্কে সম্ভবত আপনার আরও সুনির্দিষ্ট হওয়া দরকার, অথবা আপনার স্ক্রিপ্টটি কীভাবে কাজ করবে সে সম্পর্কে আপনার একটি ভুল ধারণা রয়েছে। কিছু কোড পোস্ট করার চেষ্টা করুন।
বেরবাজে

ধন্যবাদ বেরবাজে, আমি কিছু প্রসঙ্গ দেওয়ার জন্য মূল পোস্টে একটি স্নিপড কোড যুক্ত করেছি। আমি এখন কি বলতে চাইছি?
jwbensley

এই উত্তরটি পুরোপুরি সঠিক নয় তবে আপনি বেরবাজে লিখেছেন, আমাকে লুপটি পুনর্বিবেচনা করতে হবে এবং শেষে -v ব্যবহার করতে হবে। পয়েন্টারের জন্য ধন্যবাদ;)
jwbensley

1
তবে এ বি দিয়ে তৈরি হলে কী হবে? অন্য কথায়, আমি যদি কোনও এ লাইন এবং এবিটির সাথে লাইনগুলি মেলাতে চাই তবে কী হবে ? একটি পাইপ কাজ করবে না।
পাইওয়াময়

15
(?<!1\.2\.3\.4).*Has exploded

নেগেটিভ লুকবিহাইন্ড (পার্ল নিয়মিত এক্সপ্রেশন) পেতে আপনাকে এটি পি দিয়ে চালানো দরকার, সুতরাং আদেশটি হ'ল:

grep -P '(?<!1\.2\.3\.4).*Has exploded' test.log

এটা চেষ্টা কর. লাইনটি এগিয়ে থাকলে তা উপেক্ষা করতে এটি নেতিবাচক লুকবাইন্ড ব্যবহার করে 1.2.3.4। আশা করি এইটি কাজ করবে!


1
আমি নিশ্চিত যে grepদৃষ্টিশক্তি সমর্থন করে না। আপনি যদি Gnu grepব্যবহার না করেন এবং --Pপিসিআর ইঞ্জিন ব্যবহার করার জন্য প্যারামিটারটি ব্যবহার না করেন ।
টিম পিটজ্যাকার

না, গ্রেপ এই ধরণের রেজেক্সকে সমর্থন করে না; p গ্রেপ -পি (? <\! 1 \ .2 \ .3 \ .4) পরীক্ষা.লগ -ব্যাশ: অপ্রত্যাশিত টোকেনের কাছে সিনট্যাক্স ত্রুটি '('
jwbensley

আপনি শৃঙ্খলা দ্বারা ব্যাখ্যা করা যেতে পারে এমন অক্ষর থাকলে এটি রেইগেক্সের উদ্ধৃতি দিতে হবে।
বেরবাজে

সঠিক উদ্ধৃতি: grep -P '(?<!1\.2\.3\.4) Has exploded' test.logনোট করুন যে লুকবাইন্ডটি কেবলমাত্র অক্ষরগুলিতে অবিলম্বে প্রকাশের মিলের অংশের আগে কাজ করে, তাই যদি ঠিকানা এবং বার্তার মধ্যে অন্য কিছু থাকে, উদাহরণস্বরূপ 1.2.3.4 FOO Has exploded, এটি কাজ করবে না।
বেরবাজে

@ টিমপিটজেকার, খুব পর্যবেক্ষণকারী। আমি এটি প্রশ্নের সাথে যুক্ত করব। এছাড়াও, দয়া করে নোট করুন যে .*নেতিবাচক বর্ণনার পিছনে একটি রয়েছে কারণ তার উদাহরণটিতে এটি রয়েছে, আমি ধারণা করি এর মধ্যে অন্য পাঠ্যও থাকতে পারে।
নিল

2
patterns[1]="1\.2\.3\.4.*Has exploded"
patterns[2]="5\.6\.7\.8.*Has died"
patterns[3]="\!9\.10\.11\.12.*Has exploded"

for i in {1..3}
 do
grep "${patterns[$i]}" logfile.log
done

হিসাবে একই হতে হবে

egrep "(1\.2\.3\.4.*Has exploded|5\.6\.7\.8.*Has died)" logfile.log | egrep -v "9\.10\.11\.12.*Has exploded"    
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.