যখন ফাইলে একাধিক চিহ্ন থাকে তখন কীভাবে 2 টি স্ট্রিংয়ের মধ্য দিয়ে এক্সট্রাক্ট করা যায়


0

আমি একটি বিশাল ফাইল থেকে ফর্ম ডেটা বের করার চেষ্টা করছি। আমার খুব নির্দিষ্ট প্যাটার্ন দরকার যা এখন পর্যন্ত আমাকে ব্যর্থ করে।
লগতে আমার এই ধারাবাহিক অংশটি রয়েছে:

Machine info and user info blah blah blah [senderID=60, 
ipaddress=/10.1.1.11:8443, serviceIdinList=[13], serviceBitbox=11111, 
servicesList= | BeatController | BeatMaker | WaveShow, client=apache, 

সমস্ত লাইন এটি প্রদর্শিত হবে।
এই লাইন থেকে আমার এটির মতো চেহারা তৈরি করা দরকার:

senderID=60, ipaddress=/10.1.1.11:8443, serviceIdinList=[13], 
serviceBitbox=11111, servicesList= | BeatController | BeatMaker | WaveShow,  

* দ্রষ্টব্য, "ওয়েভশো" এর পরে সমস্ত কিছু অপ্রাসঙ্গিক, যেমন "সেন্ডারআইডি" এর আগে সবকিছু ছিল

আমি এখানে একটি পোস্ট থেকে এই আদেশটি চেষ্টা করেছি,

sed -n '/servicesList=/{s/.*servicesList=//;s/\S*=.*//;p}'

তবে এটি কেবল প্রিন্ট করে

servicesList= | BeatController | BeatMaker | WaveShow

আমি এটিকে কিছু পুনরাবৃত্তিতে রেগেক্সের মাধ্যমে সংশোধন করার চেষ্টা করেছি, গ্রেপ এবং সেডের সাথে খেলেছি তবে কোনও অগ্রগতি হয়নি

উত্তর:


0

আপনি যা করতে চেষ্টা করছেন তা যদি অন্তর্ভুক্ত senderID=এবং অন্তর্ভুক্ত সমস্ত কিছু আউটপুট করে WaveShow,তবে আপনার এই sedআদেশটি প্রয়োজন :

sed -n 's/.*\(senderID=.*WaveShow,\).*/\1/p'

এটি \(এবং \)বন্ধনী ব্যবহার করে two দুটি স্ট্রিংয়ের মধ্যে সমস্ত কিছু ক্যাপচার করবে এবং এটির ব্যবহার করে আউটপুট করুন \1(এবং \2যদি আপনার আরও ক্যাপচার থাকে তবে)।

মনে রাখবেন যে নেতৃস্থানীয়টি .*"লোভী", অর্থাত যদি আপনার ইনপুটটিতে senderID=দু'বার স্ট্রিং থাকে তবে প্রথমটি বাতিল করা হবে। এটি যদি আপনি চান sedনা তবে সঠিক সরঞ্জাম নয়; perlএটি পরিচালনা করতে পারে আদেশটি তখন পরিণত হয়:

perl -ne 'print if s/.*?(senderID=.*WaveShow,).*/$1/'

-nমানে "ইনপুটটির প্রতিটি লাইনের জন্য একটি লুপ চালান, এবং লুপের শেষে লাইনটি প্রিন্ট করবেন না"। -eলুপের ভিতরে নির্বাহ করতে এক্সপ্রেশনটি নির্দিষ্ট করে।

?পরে .*পরিবর্তন *সম্ভব সামান্য এ মেলে (অর্থাত অ সাগ্রহে মেলে)। বন্ধনীগুলি সেই অংশটিকে গোষ্ঠীভুক্ত করে এবং এটি ক্যাপচার করে, যা পরে $1প্রথম ক্যাপচার হিসাবে ব্যবহৃত হয় , $2দ্বিতীয়টির জন্য ইত্যাদি be

তবে পার্লে এটি করার সর্বোত্তম উপায় নয়। এটি অনেক ভাল কারণ এতে অযথা স্ট্রিংগুলি পরিবর্তন করা, পাঠ্য ক্যাপচার করা এবং কেবল মুদ্রণ করা জড়িত না:

perl -ne 'print "$1\n" if /(senderID=.*WaveShow,)/'

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


0

পিছনে কমা প্রয়োজন?

যদি তা না হয় তবে এটি কাজ করা উচিত:

grep senderID filename | cut -d '[' -f 2- | cut -d ',' -f -5

আউটপুট:

senderID=60, ipaddress=/10.1.1.11:8443, serviceIdinList=[13], serviceBitbox=11111, servicesList= | BeatController | BeatMaker | WaveShow

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