মিলে যাওয়ার প্যাটার্নের পরে কেবল একটি লাইনের অংশটি ফিরুন


109

সুতরাং কোনও ফাইল খুলুন catএবং তারপরে grepম্যাচিং লাইনগুলি ব্যবহার করে কেবলমাত্র আমার কাছে পৌঁছে যায় যখন আমি নির্দিষ্ট লগ সেটটির সাথে কাজ করছি যা আমি কাজ করছি। প্যাটার্নে লাইনগুলি মিলানোর জন্য এটির একটি উপায় প্রয়োজন তবে কেবল ম্যাচের পরে লাইনের অংশটি ফিরিয়ে আনতে হবে। ম্যাচের আগের এবং পরে অংশটি ধারাবাহিকভাবে পরিবর্তিত হবে। আমি sedবা ব্যবহার করে খেলেছি awk, তবে ম্যাচের আগে অংশটি মুছে ফেলার জন্য কীভাবে লাইনটি ফিল্টার করতে হবে তা বুঝতে সক্ষম হয়েছি বা ম্যাচের পরে অংশটি ফিরে পাবে, তা হয় কাজ করবে। এটি এমন একটি লাইনের উদাহরণ যা আমাকে ফিল্টার করতে হবে:

2011-11-07T05:37:43-08:00 <0.4> isi-udb5-ash4-1(id1) /boot/kernel.amd64/kernel: [gmp_info.c:1758](pid 40370="kt: gmp-drive-updat")(tid=100872) new group: <15,1773>: { 1:0-25,27-34,37-38, 2:0-33,35-36, 3:0-35, 4:0-9,11-14,16-32,34-38, 5:0-35, 6:0-15,17-36, 7:0-16,18-36, 8:0-14,16-32,34-36, 9:0-10,12-36, 10-11:0-35, 12:0-5,7-30,32-35, 13-19:0-35, 20:0,2-35, down: 8:15, soft_failed: 1:27, 8:15, stalled: 12:6,31, 20:1 }

আমার যে অংশটি প্রয়োজন তা হ'ল "স্থবির" পরে after

এর পিছনের পটভূমিটি হ'ল আমি জানতে পারি যে কতগুলি ঘন ঘন স্টল থাকে:

cat messages | grep stalled | wc -l

আমাকে যা করতে হবে তা খুঁজে বের করতে হবে যে কোনও নির্দিষ্ট নোড কতবার স্থবির হয়েছে ("স্তব্ধ" হওয়ার পরে প্রতিটি কোলনের আগে অংশ দ্বারা নির্দেশিত। কোনও স্টল নেই, যা আমাকে সাহায্য করে না I আমাকে কেবল স্থির অংশটি ফিল্টার করতে হবে যাতে আমি স্থির হয়ে যাওয়া লোকগুলির মধ্যে একটি নির্দিষ্ট নোডের জন্য গ্রেপ করতে পারি।

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


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

এটির শিরোনাম স্তন্যপান। আমি তোমার চুরি করেছি যা খুব সুন্দর। sedসমাধানটি নিন এবং হোয়াইটস্পেসের বিশেষ ব্যবহার করবেন না।
গিলস

@ গিলিস, এটি এমন কিছু যা আমি কীভাবে করব তা পুরোপুরি নিশ্চিত নই। আমি এখনও সেড শিখছি।
ম্যাক্লেড


1
@ shaa0601 আমি আপনার প্রশ্নটি বুঝতে পারি না, বিন্যাস ছাড়াই একটি মন্তব্যে অনুসরণ করা বিশেষত কঠিন। একটি নতুন, স্ব-অন্তর্ভুক্ত প্রশ্ন জিজ্ঞাসা করুন।
গিলস

উত্তর:


141

এর জন্য ক্যানোনিকাল টুলটি হবে sed

sed -n -e 's/^.*stalled: //p'

বিস্তারিত ব্যাখ্যা:

  • -n এর অর্থ ডিফল্টরূপে কিছু না ছাপানো।
  • -e একটি সেড কমান্ড অনুসরণ করা হয়।
  • s প্যাটার্ন রিপ্লেসমেন্ট কমান্ড।
  • ^.*stalled:আপনি যে ধরণটি সন্ধান করছেন তার নিয়মিত অভিব্যক্তিটির সাথে মিল রয়েছে পূর্ববর্তী কোনও পাঠ্য ( .*অর্থাত কোনও পাঠ্য যার অর্থ ^মিল আছে যে লাইনের শুরুতে ম্যাচটি শুরু হয়)। মনে রাখবেন যে stalled:লাইনে বেশ কয়েকবার ঘটনা ঘটে তবে এটি শেষ ঘটনার সাথে মিলবে।
  • ম্যাচ, অর্থাৎ লাইন পর্যন্ত stalled:সমস্ত কিছু খালি স্ট্রিংয়ের (অর্থাৎ মুছে ফেলা) দ্বারা প্রতিস্থাপিত হবে।
  • চূড়ান্ত pঅর্থ রূপান্তরিত রেখা মুদ্রণ করা।

আপনি যদি মিলে যাওয়া অংশটি ধরে রাখতে চান তবে একটি প্রতিবিম্ব ব্যবহার করুন: \1প্রতিস্থাপন অংশে \(…\)প্যাটার্নে একটি গ্রুপের ভিতরে কী রয়েছে তা নির্ধারণ করে। এখানে, আপনি stalled:প্রতিস্থাপন অংশে আবার লিখতে পারেন ; আপনি যে প্যাটার্নটি সন্ধান করছেন সেটি সাধারণ স্ট্রিংয়ের চেয়ে বেশি সাধারণ হলে এই বৈশিষ্ট্যটি কার্যকর।

sed -n -e 's/^.*\(stalled: \)/\1/p'

কখনও কখনও আপনি ম্যাচের পরে লাইনের অংশটি সরাতে চাইবেন। .*$প্যাটার্নের শেষে ( .*রেখার শেষে কোনও পাঠ্য $) অন্তর্ভুক্ত করে আপনি ম্যাচে এটি অন্তর্ভুক্ত করতে পারেন । প্রতিস্থাপন পাঠ্যের ক্ষেত্রে আপনি যে অংশটি উল্লেখ করেছেন সেই অংশটি না রাখলে লাইনের শেষটি আউটপুটে থাকবে না।

গ্রুপ এবং ব্যাক রেফারেন্সগুলির আরও চিত্রণ হিসাবে, এই কমান্ডটি ম্যাচের আগে এবং ম্যাচের পরে অংশটি অদলবদল করে।

sed -n -e 's/^\(.*\)\(stalled: \)\(.*\)$/\3\2\1/p'

আমি প্রথম দুটি উদাহরণ চেষ্টা করেছি এবং এটি কেবল স্তব্ধ বলে মনে হচ্ছে। আমি একটি ত্রুটি বার্তা পাই না, বা নতুন প্রম্পটও পাই না, কিছুই নেই।
ম্যাক্লিওড

2
@ ম্যাকলিউড ওহ, এটি স্ট্যান্ডার্ড ইনপুটটিতে ইনপুটটির জন্য অপেক্ষা করছে, যা এখানে টার্মিনাল কারণ আপনি এটি পুনঃনির্দেশ করেন নি। আপনি এখানে কোনও ইনপুট পুনর্নির্দেশ করবেন sed … <messages, যেহেতু আপনি কোনও ফাইল থেকে ডেটা প্রক্রিয়া করতে চান। অন্য কমান্ড দ্বারা উত্পাদিত ডেটার উপর কাজ করার জন্য, আপনাকে একটি নল ব্যবহার করতে চাই: somecommand | sed …
গিলস

1
ঠিক আছে, সেখানে দিনের অন্ধকারের সমাপ্তি। কমান্ড পুরোপুরি কাজ করে, ধন্যবাদ।
ম্যাক্লিওড

1
আমি এখনও অবধি দেখেছি সেরা সেড ব্যাখ্যা - ধন্যবাদ!
জন ওয়েডসওয়ার্থ

1
@ বাঙ্গালক্রাইসের সংক্ষিপ্ত সংস্করণটি কী? এটি আমার উত্তরের কোনও আদেশের সমতুল্য নয়। আমি এটি লেখার প্রস্তাব দিই sed 's/^.*stalled//'যেহেতু -rলিনাক্সের সাথে নির্দিষ্ট এবং এটি ম্যাকওএসের মতো অন্যান্য সিস্টেমে কাজ করে না এবং এখানে আপনি এটি থেকে কোনও সুবিধা পাচ্ছেন না।
গিলস

72

আপনি ইতিমধ্যে ব্যবহার করেন এমন অন্যান্য আধ্যাত্মিক সরঞ্জাম grep:

উদাহরণ স্বরূপ:

grep -o 'stalled.*'

গিলসের দ্বিতীয় বিকল্পের মতো একই ফলাফল রয়েছে:

sed -n -e 's/^.*\(stalled: \)/\1/p'

-oপতাকা ফেরৎ --only-matchingঅবশ্যই - - স্বাভাবিকভাবে, grep দ্বারা সম্পন্ন মত প্রকাশের অংশ, তাই সমগ্র লাইন যা।

আউটপুট থেকে "স্থবির:" অপসারণ করতে, আমরা একটি তৃতীয় ক্যানোনিকাল সরঞ্জাম ব্যবহার করতে পারি, কাটা:

grep -o 'stalled.*' | cut -f2- -d:

cutকমান্ড বিভেদক ব্যবহার :শেষ পর্যন্ত এবং প্রিন্ট ক্ষেত্র 2। এটি অবশ্যই অগ্রাধিকারের বিষয়, তবে cutসিনট্যাক্সটি মনে রাখা খুব সহজ মনে হয়।


1
-oবিকল্পটি উল্লেখ করার জন্য ধন্যবাদ ! আমি এটি উল্লেখ করতে চেয়েছিলাম যে grepএটি \nএকটি নতুন লাইন হিসাবে স্বীকৃতি দেয় না , তাই আপনার প্রথম উদাহরণটি কেবল প্রথম nচরিত্রের সাথে মেলে । উদাহরণস্বরূপ, echo "Hello Anne" | grep -o 'A[^\n]*'স্ট্রিংটি প্রদান করে A। যাইহোক, echo "Hello Anne" | grep -o 'A.*'প্রত্যাশিতটিকে ফেরত দেয় Anne, যেহেতু .নিউলাইন ছাড়া অন্য কোনও চরিত্রের সাথে মেলে।
আদমলমার

1
নোট করুন যে cutডিলিমিটারের চারপাশের উদ্ধৃতিগুলি -d':'@ পোইজ দ্বারা সরানো হয়েছে। আমি উদ্ধৃতি সহ মনে রাখা সহজ মনে করি, যেমন -d' 'বা এর সাথে -d';'
আন ভ্যান রসম

আপনার সন্ধান অনুসারে এগুলির সাথে কোটগুলি ব্যবহার করা মনে রাখা সহজ হওয়া উচিত -f 2। সিরিয়াসলি, কেন নয়?
পোজ

কারণ কোলনের ;চেয়ে আধা-কোলনের মতো ডিলিমিটারের :উদ্ধৃতি না দিয়ে আলাদাভাবে ব্যাখ্যা করা হবে। অবশ্যই এটি যৌক্তিক আচরণ, তবে এখনও আমি পেশীগুলির স্মৃতিতে নির্ভর করতে চাই। আমি একবারে ডিলিমিটারটি উদ্ধৃত করতে পছন্দ করি না তবে অন্য সময় নয়। আমি আগে যেমন বলেছিলাম ঠিক তেমন ব্যক্তিগত পছন্দ: মনে রাখা সহজ।
অ্যান ভ্যান রসম

সময়ের যে অংশ .*: প্রয়োজন হয় আমার জন্য ভাল কাজ cat filename | grep 'Return only this line xyz text' | grep -o 'xyz.*' আয়xyz text
Ron

4

আমি ifconfig | grep eth0 | cut -f3- -d:এটা নিতে ব্যবহৃত

    [root@MyPC ~]# ifconfig
    eth0  Link encap:Ethernet  HWaddr AC:B4:CA:DD:E6:F8
          inet addr:192.168.0.2  Bcast:192.168.0.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:78998810244 errors:1 dropped:0 overruns:0 frame:1
          TX packets:20113430261 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:110947036025418 (100.9 TiB)  TX bytes:15010653222322 (13.6 TiB)

এবং এটি দেখতে চেহারা

    [root@MyPC ~]# ifconfig | grep eth0 | cut -f3- -d:
    C4:7A:4D:F6:B8

2
এটি কি প্রশ্নের উত্তর দেয়?
স্টিফেন রাউচ

1
আপনি ব্যবহার করতে পারেন cat /sys/class/net/*/address, কোনও পার্সিংয়ের প্রয়োজন নেই।
অ্যান ভ্যান রসম

1

তবুও আপনি বিবেচিত অন্য একটি ক্যানোনিকাল সরঞ্জাম awkনিম্নলিখিত লাইনের সাথে ব্যবহার করা যেতে পারে:

awk -F"stalled" '/stalled/{print $2}' messages

বিস্তারিত ব্যাখ্যা:

  • -Fরেখার জন্য একটি বিভাজককে সংজ্ঞায়িত করে, "স্টলড"। বিভাজক আগে সবকিছু সঙ্গে সম্বোধন করা হয়েছে $1সঙ্গে পরে সবকিছু এবং $2
  • /reg-ex/ মিলে যাওয়া নিয়মিত অভিব্যক্তি অনুসন্ধান করে, এই ক্ষেত্রে "স্থবির"।
  • {print $<n>}- প্রিন্ট এন কলাম। যেহেতু আপনার বিভাজক স্থবির হিসাবে সংজ্ঞায়িত হয়েছে, তাই স্থগিতের পরে সমস্ত কিছু দ্বিতীয় কলাম হিসাবে বিবেচিত হবে।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.