পরের লাইনে কোনও নির্দিষ্ট মিল না থাকলে কেবল একটি লাইন মুদ্রণ করুন


12

লগ করা ক্রিয়াকলাপগুলির জন্য লগ ফাইল অনুসন্ধান করার চেষ্টা করছি যা সম্পূর্ণ হয়নি। উদাহরণস্বরূপ, আমি একটি "আইডি 1234 এর জন্য ক্রিয়াকলাপ শুরু করছি ..." লগ করি এবং যদি সফল হয় তবে পরবর্তী লাইনটি "ক্রিয়াকলাপ 1234 সম্পূর্ণ হয়েছে।"

আমি "সূচনা ..." লাইনগুলি পাওয়ার চেষ্টা করছি যা তাদের সম্পর্কিত "সমাপ্ত" লাইন অনুসরণ করে না।

উদাহরণ লগ ফাইল

Starting activity for ID 1234
ID 1234 completed successfully
Starting activity for ID 3423
ID 3423 completed successfully
Starting activity for ID 9876
ID 9876 completed successfully
Starting activity for ID 99889
ID 99889 completed successfully
Starting activity for ID 10011
ID 10011 completed successfully
Starting activity for ID 33367
Starting activity for ID 936819
ID 936819 completed successfully

এই উদাহরণে, আমি আউটপুটটি সন্ধান করব:

Starting activity for ID 33367

... কারণ এটি "সমাপ্ত" লাইন অনুসরণ করে না।

আমি এই কাজ চেষ্টা করেছি grepএবং awkকিন্তু অনেক সাফল্য ছিল না। আমি ধরে নিচ্ছি যে এটির একটি সরঞ্জাম দিয়ে এটি করা যেতে পারে তবে আমার grepএবং awkচপগুলি উন্নত নয়।

আমার এখানে প্রয়োজনীয় ফলাফল দেওয়ার জন্য দ্রুত এবং নির্ভরযোগ্য grepবা awkপ্যাটার্নের সন্ধান করছি।


আমি মনে করি না যে গ্রেপ + অজকের সাহায্যে এটি সহজ, তবে আপনি কেন করছেন তা সম্পর্কে আপনি কিছুটা ব্যাখ্যা করতে পারেন? সমস্ত চলমান ক্রিয়াকলাপের একটি আউটপুট, উদাহরণস্বরূপ সাফল্য বা ফিনসিহড নয়?
ডেইজি

@ warl0ck, আমি "সমাপ্ত না" খুঁজছি
প্যাটমৌলর

উত্তর:


10

এখানে একটি awkবিকল্প:

awk '
  /^Starting/ { I[$5] = $0                  }
  /^ID/       { delete I[$2]                }
  END         { for (key in I) print I[key] }
' infile

আউটপুট:

Starting activity for ID 33367

Iএসসিয়েতিভ আরে কি আইডি দেখা যায় ট্র্যাক রাখে।


এটি সত্যিই খুব ভালভাবে কাজ করে, যেমন এটি এমন পরিস্থিতিতে যেমন "শুরু হচ্ছে ..." এবং "সমাপ্ত ..." লগ লাইনগুলি সংলগ্ন / অনুক্রমিক নয়। ধন্যবাদ @ থোর!
প্যাটমৌলার

আপনার স্বাগত। এটি (প্রায়) নির্বিচার আকারের ইনপুটটির সাথে দক্ষতার সাথে কাজ করা উচিত কারণ এটি কেবল কখনও আইডি সঞ্চয় করে এবং দেখার সময় হ'ল (1)।
থোর

খুশী হলাম। কেবল একটি জিনিস: আমি @ রবার্টএল ( ইউনিক্স.স্ট্যাকেক্সেক্সঞ্জ. com/ a/ 243550/ 135943 ) থেকে শিখেছি আপনাকে অ্যারের উপাদান তৈরি করতে কোনও মান নির্ধারণ করার দরকার নেই। পরিবর্তে I[$5] = 1, আপনি কেবল ব্যবহার করতে পারেন I[$5]। (আপনি মান যত্নশীল না, আপনি শুধু উপাদান করতে চাই থাকবেই এবং নিছক এটা যে accomplishes নামকরণ।)
ওয়াইল্ডকার্ড

@ উইল্ডকার্ড: আপনি ঠিকই বলেছেন, তবে ওপির প্রশ্ন এবং আউটপুটটির মতো গ্রেপের ফলাফল পর্যালোচনা করার পরে, পুরো লাইনটি এবং আউটপুটটি শেষের দিকে মনে রাখা আরও উপযুক্ত।
Thor

3
sed '$!N;/\n.*completed/d;P;D' <input

এই আউটপুট থেকে সমস্ত ইনপুট লাইন যা স্ট্রিং মিলে একটি লাইন দ্বারা অনুসরণ করা হয় না মুছে ফেলবে সম্পন্ন


2

আপনি এটি জিএনইউ সেড দিয়ে কীভাবে করতে পারেন তা এখানে:

sed -r 'N; /([0-9]+)\n\w+\s+\1/d; P; D' infile
  • N প্যাটার্ন স্পেসে আরও একটি লাইন পড়ে।
  • অভিন্ন আইডগুলি পাওয়া যায় কিনা ম্যাচ রেজেক্স চেক করে, যদি তেমন প্যাটার্ন স্পেস মুছে ফেলা হয় ( d) এবং চক্রটি পুনরায় আরম্ভ করা হয়।
  • যদি এটি মেলে না, প্যাটার্ন স্পেসে প্রথম লাইনটি মুদ্রণ করুন ( P) এবং এটি মুছুন ( D)।

আমি এখানে বর্ধিত কিছু দেখতে পাচ্ছি না ... তাই -rদরকার নেই, তাই না?
লুই ম্যাডডক্স

1
@ এমএমএমএক্স: এটি দরকার কারণ অন্যথায় ক্যাপচার গ্রুপটি পালাতে হবে এবং +কোয়ান্টেটিফায়ারের ক্ষেত্রেও এটি একই রকম ।
থর

আহ, ঠিক আছে! আমি এটিকে সংশোধন করেছি এবং জানানো হয়েছিল যে এটি প্রয়োজনীয় ছিল না, স্পষ্ট করার জন্য ধন্যবাদ
লুই ম্যাডডক্স ২

1

যদি আপনার ইনস্টলেশন পিসিগ্রেপ সমর্থন করে তবে মাল্টলাইন (-M) বিকল্পটি কাজে আসবে।

pcregrep -M -o '\AStarting activity for ID (\d+)\n(?!ID \1)' t.z

আইডি 33367 এর জন্য ক্রিয়াকলাপ শুরু করা হচ্ছে

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