Awk ব্যবহার করে কীভাবে মিলে যাওয়া রেজেক্স প্যাটার্ন মুদ্রণ করবেন?


109

ব্যবহার করে awk, আমার একটি ফাইলের মধ্যে একটি শব্দ খুঁজে পাওয়া দরকার যা একটি রেজেক্স প্যাটার্নের সাথে মেলে।

আমি কেবল প্যাটার্নের সাথে মেলে শব্দটি মুদ্রণ করতে চাই।

সুতরাং যদি লাইনে থাকে, আমার কাছে রয়েছে:

xxx yyy zzz

এবং নিদর্শন:

/yyy/

আমি কেবল পেতে চাই:

yyy

সম্পাদনা: কুরুমিকে ধন্যবাদ আমি এই জাতীয় কিছু লিখতে পেরেছি :

awk '{
        for(i=1; i<=NF; i++) {
                tmp=match($i, /[0-9]..?.?[^A-Za-z0-9]/)
                if(tmp) {
                        print $i
                }
        }
}' $1

এবং এটি আমার দরকার ছিল :) অনেক অনেক ধন্যবাদ!


1
@ ম্যাক্সটালডিकिन আপনি নিজের উত্তরটি প্রশ্ন থেকে আলাদা উত্তরে স্থানান্তর করতে পারবেন দয়া করে?
কেনারব

2
আপনার করার দরকার নেই tmp=match($i, /regexp);if(tmp){}, আপনার কেবলমাত্র সক্ষম হওয়া উচিত if(tmp ~ $i){}কারণ ~"" রেজিএক্সপ্লেসের সাথে মেলে "means
জাস্টিনসিবি

উত্তর:


148

এটি খুব বেসিক

awk '/pattern/{ print $0 }' file

ব্যবহারের awkজন্য অনুসন্ধান করতে বলুন , তারপরে লাইনটি মুদ্রণ করুন, যা ডিফল্টরূপে রেকর্ড বলা হয়, $ 0 দ্বারা চিহ্নিত। অন্তত ডকুমেন্টেশন পড়ুনpattern//

আপনি যদি কেবল মিলে যাওয়া শব্দটি মুদ্রণ করতে চান।

awk '{for(i=1;i<=NF;i++){ if($i=="yyy"){print $i} } }' file

49
যেহেতু printডিফল্ট ক্রিয়া: awk '/pattern/' fileযথেষ্ট হবে।
জনসিওয়েব

18
@ জনসইয়েব, হ্যাঁ আমি এই বাস্তবতাটি জানি। মার্ভারিক্সের মতো একজন নবজাতকের কাছে এর অর্থ আরও ভিজ্যুয়াল।
কুড়ুমি

21
আমি আপনার জ্ঞান সন্দেহ করি না। তথাপি অন্যদের এই উত্তরটি খুঁজে পেতে দরকারী হতে পারে।
জনসিওয়েব

2
এনবি: @ মারওয়ারিক্সকে -লুপটি কাজ করতে আরও কিছু বাড়ির কাজ করতে হবে forযদি (ক) "হ্যাঁ" একটি নিয়মিত প্রকাশ হয় এবং কোনও সরল স্ট্রিং নয় এবং (খ) যদি "হ্যাঁ" পুরো ক্ষেত্রের সাথে মেলে না তবে একটি রেকর্ড.
জনসয়েব

8
এটা হবে না $i=="yyy"; এটি $i ~ /yyy/একটি নিয়মিত প্রকাশের জন্য হবে ।
জাস্টিনসিবি

118

দেখে মনে হচ্ছে আপনি GNU এর grep -oআচরণ অনুকরণ করার চেষ্টা করছেন । এটি আপনাকে প্রতিটি লাইনে কেবল প্রথম ম্যাচটি দিতে চাইবে তা করবে:

awk 'match($0, /regex/) {
    print substr($0, RSTART, RLENGTH)
}
' file

জিএনইউ এর awkবাস্তবায়ন ব্যবহার করে এখানে একটি উদাহরণ দেওয়া হয়েছে ():

awk 'match($0, /a.t/) {
    print substr($0, RSTART, RLENGTH)
}
' /usr/share/dict/words | head
act
act
act
act
aft
ant
apt
art
art
art

সম্পর্কে পড়ুন match, substr, RSTARTএবং RLENGTHawkম্যানুয়াল।

এর পরে আপনি একই লাইনে একাধিক ম্যাচ মোকাবেলা করতে এটি প্রসারিত করতে ইচ্ছুক হতে পারেন।


বিবি: এই শেষ অংশটির উত্তর দিতে, প্রয়োজনীয় সমস্ত নির্মাণকর্মগুলি কুরুমীর উত্তর এবং আমার নিজস্ব।
জনসিওয়েব

দুর্দান্ত উত্তর। আমি এখানে জায়গায় একটি ব্যাখ্যা চাই কারণ আমি অলস। তবে সে কারণেই আমি এডাব্লুকে ব্যবহার করছি!
lukas.pukenis

আমি যদি মুদ্রণ ব্যতীত ম্যাচের ফলাফলের সাথে কিছু করতে চাই? উদাহরণস্বরূপ, আমি অ্যারেতে সমস্ত ম্যাচ যুক্ত করতে চাই।
Evya2005

@ evya2005: আপনি কেবল আপনার প্রয়োজনীয় কার্যভারটি দিয়ে কল রন প্রিন্টটি প্রতিস্থাপন করতে পারেন।
জনসিওয়েব

এটা আমার পক্ষে কাজ করছে না শুধুমাত্র মুদ্রণ কাজ। আপনি আমাকে উদাহরণ দেখাতে পারেন?
Evya2005

36

গোক এটিকে ক্রিয়া হিসাবে ব্যবহার করে প্রতিটি লাইনের মিলের অংশটি পেতে পারে:

{ if (match($0,/your regexp/,m)) print m[0] }

ম্যাচ (স্ট্রিং, রিজেক্সএক্স [, অ্যারে]) অ্যারে উপস্থিত থাকলে এটি সাফ হয়ে যায় এবং তারপরে অ্যারের জিরোথ এলিমেন্টটি স্ট্রিংয়ের পুরো অংশে সেট করা হয় রেজিএক্সএক্সের সাথে মিলে যায়। যদি রেজিপ্সপতে প্রথম বন্ধনী থাকে তবে অ্যারের পূর্ণসংখ্যার সূচক উপাদানগুলি সম্পর্কিত প্যারেন্থাইজড সুব এক্সপ্রেসের সাথে মিলে স্ট্রিংয়ের অংশটি সেট করে। http://www.gnu.org/software/gawk/manual/gawk.html#String-Functions


13

যদি আপনি কেবল ইনপুটটির শেষ লাইনের প্রতি আগ্রহী হন এবং আপনি কেবল একটি মিল খুঁজে পেতে আশা করেন (উদাহরণস্বরূপ শেল কমান্ডের সারসংক্ষেপ রেখার একটি অংশ), আপনি কীভাবে রেজিএক্সএক্স ম্যাচগুলি প্রিন্ট করবেন তা থেকে গৃহীত এই খুব কমপ্যাক্ট কোডটিও দেখতে পারেন `awk` ব্যবহার করছেন? :

$ echo "xxx yyy zzz" | awk '{match($0,"yyy",a)}END{print a[0]}'
yyy

বা আংশিক ফলাফল সহ আরও জটিল সংস্করণ:

$ echo "xxx=a yyy=b zzz=c" | awk '{match($0,"yyy=([^ ]+)",a)}END{print a[1]}'
b

সতর্কতা: awk match()তিনটি আর্গুমেন্ট সহ ফাংশনটি কেবল উপস্থিত রয়েছে gawk, ভিতরে নেইmawk

এর পরিবর্তে লুকবিহিন রিজেেক্স ব্যবহার করে এখানে আরও একটি দুর্দান্ত সমাধান দেওয়া হয়েছে । এই সমাধানটি আপনার ইনস্টলেশন কম প্রয়োজন:grepawk

$ echo "xxx=a yyy=b zzz=c" | grep -Po '(?<=yyy=)[^ ]+'
b

আপনি "লেজ -n1" যুক্ত করলেন কেন? এটি ছাড়া এটি ঠিক কাজ করা উচিত, না?
আর্থার অ্যাকসিওলি

1
পুনঃটুইট আমি এই শব্দটি পিং কল থেকে গড় রাউন্ডট্রিপ সময় উত্তোলনের জন্য ব্যবহার করি, সেখান থেকেই এটি এসেছে। মজার যে এটি এটি আবিষ্কার করতে 4 বছর লেগেছিল;)
ড্যানিয়েল অ্যাল্ডার

12

পার্ল যদি বিকল্প হয় তবে আপনি এটি ব্যবহার করে দেখতে পারেন:

perl -lne 'print $1 if /(regex)/' file

কেস-সংবেদনশীল মিলটি বাস্তবায়নের জন্য, iসংশোধক যুক্ত করুন

perl -lne 'print $1 if /(regex)/i' file

ম্যাচের পরে সবকিছু মুদ্রণ করতে:

perl -lne 'if ($found){print} else{if (/regex(.*)/){print $1; $found++}}' textfile

ম্যাচটি এবং ম্যাচের পরে সমস্ত কিছু মুদ্রণ করতে:

perl -lne 'if ($found){print} else{if (/(regex.*)/){print $1; $found++}}' textfile

3

সেড ব্যবহার করাও এই পরিস্থিতিতে মার্জিত হতে পারে। উদাহরণ (লাইন থেকে মিলিত গোষ্ঠী "yyy" দিয়ে লাইনটি প্রতিস্থাপন করুন):

$ cat testfile
xxx yyy zzz
yyy xxx zzz
$ cat testfile | sed -r 's#^.*(yyy).*$#\1#g'
yyy
yyy

প্রাসঙ্গিক ম্যানুয়াল পৃষ্ঠা: https://www.gnu.org/software/sed/manual/sed.html#Back_002dreferences- এবং- YouTube এক্সপ্রেশন


নন- sed -n 's/^.*\(yyy\).*$/\1/gp' < testfile
গ্নু সেডের

1
@ গ্রেগরিএন্টিন - বিএসডি সেড আসল উত্তরের সাথে কাজ করে। পসিক্স দ্বারা সমর্থিত বর্ধিত রেজেক্স স্যুইচ হ'ল -ই, তবে ফ্রিবিএসডি-তে কমপক্ষে -r সমান -E (2010-এ যুক্ত হয়েছে)। যাইহোক, চেষ্টা করুন -E (4.3-এ Gnu সেড যুক্ত)
জুয়ান

3

বিষয়বস্তুতে, গ্রেপ ব্যবহার করে এটিও করা যেতে পারে, যদি কেউ গ্রেপ সমাধানের সন্ধান করে তবে এটি এখানে পোস্ট করা ing

echo 'xxx yyy zzze ' | grep -oE 'yyy'

এমনকি রেইগেক্স সহ এটি ধরার সহজ উপায়। ঠিক আমার যা প্রয়োজন ছিল। ধন্যবাদ!
মার্কি

এটি আমার পক্ষে কাজ করে; আমার কেসটি এর মতো: প্রতিধ্বনি "ওয়েব_পোর্ট = 8080, শাটডাউন_পোর্ট = 8005" | গ্রেপ -ওই "ওয়েব_পোর্ট = [0-9] +" # রিটার্ন 8080
রব সাং

0

আপনি যে পাঠ্য / প্যাটার্নটি সন্ধান করছেন তা যদি জানেন (যেমন "yyy"), আপনি কেবল সেই নির্দিষ্ট কলামটি মেলে কিনা তা পরীক্ষা করে এটি মুদ্রণ করতে পারেন।

উদাহরণস্বরূপ, নিম্নলিখিত বিষয়বস্তু সহ একটি ফাইল দেওয়া হয়েছে, ( ্যাসিডা.টেক্সট নামে পরিচিত )

xxx yyy zzz

কেবলমাত্র দ্বিতীয় কলামটি মুদ্রণ করতে যদি এটি "yyy" প্যাটার্নটির সাথে মেলে, আপনি এরকম কিছু করতে পারেন:

awk '$2 ~ /yyy/ {print $2}' asdf.txt

নোট করুন যে এটি মূলত যে কোনও লাইনের সাথে মিলবে যেখানে দ্বিতীয় কলামটিতে এর মধ্যে "yyy" রয়েছে:

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