এওজেডে একাধিক ডিলিমিটার ব্যবহার করা


202

আমার কাছে একটি ফাইল রয়েছে যার মধ্যে নিম্নলিখিত লাইন রয়েছে:

/logs/tc0001/tomcat/tomcat7.1/conf/catalina.properties:app.env.server.name = demo.example.com
/logs/tc0001/tomcat/tomcat7.2/conf/catalina.properties:app.env.server.name = quest.example.com
/logs/tc0001/tomcat/tomcat7.5/conf/catalina.properties:app.env.server.name = www.example.com

উপরের আউটপুটে আমি 3 টি ক্ষেত্র বের করতে চাই (সংখ্যা 2, 4 এবং শেষটি *.example.com)। আমি নিম্নলিখিত আউটপুট পাচ্ছি:

cat file | awk -F'/' '{print $3 "\t" $5}'
tc0001   tomcat7.1
tc0001   tomcat7.2
tc0001   tomcat7.5

আমি পরে ডোমেন নাম দিয়ে শেষ ক্ষেত্র নিষ্কাশন করব '='? আমি multiple delimiterক্ষেত্র নিষ্কাশন করতে কীভাবে ব্যবহার করব ?


2
আমার প্রশ্নের উত্তরের জন্য যা একই, তবে ভিন্ন, awkক্ষেত্রগুলি গিলে ফেলছিল যখন তারা ফাঁকা ছিল যা ক্ষেত্রের নম্বরটি নষ্ট করে দিয়েছে। আমি পরিবর্তন -F " "করতে -F "[ ]"এবং awkআর খালি ক্ষেত্র গেলা নি।
আদম

উত্তর:


324

ডিলিমিটার একটি নিয়মিত প্রকাশ হতে পারে।

awk -F'[/=]' '{print $3 "\t" $5 "\t" $8}' file

উত্পাদন:

tc0001   tomcat7.1    demo.example.com  
tc0001   tomcat7.2    quest.example.com  
tc0001   tomcat7.5    www.example.com

42
অবশ্যই, catপ্রক্রিয়া প্রয়োজন নেই: awk '...' file। এছাড়াও, আউটপুট ফিল্ড বিভাজকটি ব্যবহার করা আরও পরিশ্রমী হবে:awk -F'[/=]' -v OFS="\t" '{print $3, $5, $8}'
গ্লেন জ্যাকম্যান

17
আউক ডিলিমিটারগুলি নিয়মিত প্রকাশ হতে পারে ... এটি আমার দিনকে পরিণত করেছে!
das.cyklone

4
@ das.cyklone: ​​awk এর সাথে কয়েকটি বিভাজকও থাকতে পারে, |যেমন: উদাহরণ: awk -F 'this|that|[=/]' '......' (শব্দগুলি / স্ট্রিংগুলিকে আলাদা করে রাখা জিনিস ব্যবহারযোগ্য ) (দ্রষ্টব্য যে এটি 2 বিভাজকের মধ্যে ফিল্ডে ফাঁকা রাখে। যোগ করাও কার্যকর |[ \t]+হতে পারে তবে জিনিসগুলি তৈরি করতে পারে কৃপণ ... কারণ 'এর' এর আগে এবং পরে প্রায়শই ফাঁকা স্থান থাকে, এটি স্পেস (গুলি) এবং 'এটি' এর মধ্যে 2 অতিরিক্ত খালি ক্ষেত্র উপস্থিত করবে
অলিভিয়ার ডুলাক

আমি এটি 2 টি ভিন্ন ডিস্ট্রোতে চেষ্টা করেছি এবং আমিও একই আচরণ পেয়েছি: আমি নেটস্ট্যাট -ntpl "নেটস্ট্যাট -এনটিপিএল | সেডস এর /: / / '| অ্যাবকে' {মুদ্রণ $ 5} '" এর কাজ থেকে বন্দরটি পেতে চাই ডুলবেল পাইপিং ছাড়া এটি করতে পারে এটি কাজ করে তবে আমি ক্ষেত্রের ডেটাটি প্রত্যাশা করছিলাম না: "netstat -ntpl | awk -F" |: "'{মুদ্রণ করুন $ 17}'"
লুইজি 600

2
হ্যাঁ ... এটি আমার যা চেয়েছিল তা পেয়েছে: awk -F "[:] +" '/ \ / পোস্টমাস্টার * $ / {মুদ্রণ করুন $ 5}'
লুইজি 600

44

ভাল খবর! awkক্ষেত্র বিভাজক একটি নিয়মিত প্রকাশ হতে পারে। আপনার কেবল ব্যবহার করতে হবে -F"<separator1>|<separator2>|...":

awk -F"/|=" -vOFS='\t' '{print $3, $5, $NF}' file

রিটার্নস:

tc0001  tomcat7.1  demo.example.com
tc0001  tomcat7.2  quest.example.com
tc0001  tomcat7.5  www.example.com

এখানে:

  • -F"/|="উভয় ইনপুট ক্ষেত্র বিভাজক সেট করে /বা =। তারপরে, এটি একটি ট্যাবে আউটপুট ক্ষেত্র বিভাজক সেট করে।

  • -vOFS='\t'-vএকটি ভেরিয়েবল সেট করার জন্য পতাকা ব্যবহার করছে । OFSআউটপুট ফিল্ড বিভাজকের জন্য ডিফল্ট পরিবর্তনশীল এবং এটি ট্যাব অক্ষরে সেট করা থাকে। পতাকাটি প্রয়োজনীয় কারণ ওএফএসের মতো কোনও অন্তর্নির্মিত নেই -F

  • {print $3, $5, $NF} ইনপুট ফিল্ড বিভাজকের উপর ভিত্তি করে 3 য়, 5 ম এবং শেষ ক্ষেত্রগুলি মুদ্রণ করে।


আরেকটি উদাহরণ দেখুন:

$ cat file
hello#how_are_you
i#am_very#well_thank#you

এই ফাইলে দুটি ক্ষেত্র বিভাজক রয়েছে #এবং _। আমরা যদি দ্বিতীয় ক্ষেত্রটি বিভাজনকারী এক বা অন্য হয়ে নির্বিশেষে মুদ্রণ করতে চাই তবে আসুন উভয়কেই বিভাজন করে তুলি!

$ awk -F"#|_" '{print $2}' file
how
am

ফাইলগুলি যেখানে নীচে নম্বরযুক্ত:

hello#how_are_you           i#am_very#well_thank#you
^^^^^ ^^^ ^^^ ^^^           ^ ^^ ^^^^ ^^^^ ^^^^^ ^^^
  1    2   3   4            1  2   3    4    5    6

1
আপনার সম্পাদনার জন্য @ BUFU ধন্যবাদ। আমি কেবল এফএস অংশটিতে ফোকাস করার জন্য অফস রেফারেন্সটি সরিয়েছি, তবে এটি থাকাও ভাল to চিয়ার্স!
ফেডরকিই 'এসও ক্ষতিগ্রস্থ হওয়া বন্ধ করুন'

5

যদি আপনার শ্বেত স্থানটি সামঞ্জস্যপূর্ণ হয় তবে আপনি \tসরাসরি প্রবেশের পরিবর্তে ডিলিমিটার হিসাবে এটি ব্যবহার করতে পারেন , আপনি আউটপুট বিভাজক সেট করতে পারেন এবং এটি স্বয়ংক্রিয়ভাবে অন্তর্ভুক্ত হবে:

< file awk -v OFS='\t' -v FS='[/ ]' '{print $3, $5, $NF}'

3

কোন সংখ্যা একটি ক্ষেত্র বিভাজক জন্য 2মাধ্যমে 5বা চিঠি aবা #বা একটি স্থান, যেখানে আলাদা চরিত্র উদাহরণস্বরূপ পুনরাবৃত্তি করা আবশ্যক অন্তত 2 বার এবং তুলনায় আরো 6 বার:

awk -F'[2-5a# ]{2,6}' ...

আমি নিশ্চিত () এবং পরামিতি ব্যবহার করে এর বিদ্যমান বিভিন্নতা রয়েছে


3

পার্ল ওয়ান-লাইনার:

perl -F'/[\/=]/' -lane 'print "$F[2]\t$F[4]\t$F[7]"' file

এই কমান্ড-লাইন বিকল্পগুলি ব্যবহার করা হয়:

  • -nইনপুট ফাইলের প্রতিটি লাইন প্রায় লুপ, $_ভেরিয়েবল মধ্যে লাইন রাখুন , প্রতিটি লাইন স্বয়ংক্রিয়ভাবে মুদ্রণ করবেন না

  • -l প্রক্রিয়াকরণের আগে নতুন লাইনগুলি সরিয়ে দেয় এবং পরে এগুলিতে আবার যুক্ত করে

  • -aঅটোস্প্লিট মোড - পার্ল স্বয়ংক্রিয়ভাবে @Fঅ্যারেতে ইনপুট লাইনগুলি বিভক্ত করবে । সাদা স্থানটিতে বিভাজনে ডিফল্ট

  • -Fautosplit পরিবর্তক, এই উদাহরণে টুকরা উপর পারেন /বা=

  • -e পার্ল কোডটি কার্যকর করুন

পার্ল @Fঅজকের সাথে ঘনিষ্ঠভাবে সম্পর্কিত, তবে, অটোস্প্লিট অ্যারে সূচকে শুরু হয় $F[0]যখন অ্যাডাব্লিক ক্ষেত্রগুলি $ 1 দিয়ে শুরু হয়।


2

আর একটি হ'ল -এফ বিকল্পটি ব্যবহার করা কিন্তু বাম এবং ডান বন্ধনীগুলির মধ্যে পাঠ্যটি প্রিন্ট করার জন্য এটি রেজেক্স পাস করুন ()

ফাইল সামগ্রী:

528(smbw)
529(smbt)
530(smbn)
10115(smbs)

আদেশ:

awk -F"[()]" '{print $2}' filename

ফলাফল:

smbw
smbt
smbn
smbs

এর মধ্যে পাঠ্যটি কেবল মুদ্রণ করতে awk ব্যবহার করে []:

ব্যবহার awk -F'[][]' কিন্তু awk -F'[[]]'কাজ করবে না।

http://stanlo45.blogspot.com/2020/06/awk-multiple-field-separators.html


আপনার উত্তরটি মুছে ফেলার কাতারে এসেছিল কারণ 10 টির মধ্যে 9 বার, 1 খ্যাতিযুক্ত ব্যবহারকারীরা তাদের নিজস্ব ব্লগে লিঙ্ক করে যা সাধারণত স্প্যাম হয়। তবে আপনার নিয়ম ব্যতিক্রম। সর্বশেষ 10 বছরের সামগ্রীতে একটি সোনার খনি রয়েছে, আশা করি এটি এটিকে অমর করার পরিকল্পনা রয়েছে।
এরিক লেসচিনস্কি

0

আমি দেখতে পাচ্ছি অনেক নিখুঁত উত্তর বোর্ডে রয়েছে, তবে এখনও আমার কোডের টুকরোটি আপলোড করতে চাই,

awk -F"/" '{print $3 " " $5 " " $7}' sam | sed 's/ cat.* =//g'


2
print $3 " " $5 " " $7ঠিক যেমন মুদ্রিত হতে পারে print $3, $5, $7। এছাড়াও, আমি awk ব্যবহার করে এবং তারপরে সেডে পাইপিংয়ের সুবিধাটি দেখতে পাচ্ছি না। সাধারণভাবে, awk পর্যাপ্ত হতে পারে এবং অন্যরা উত্তরগুলি তা দেখায়।
ফেডরকিই 'এসও ক্ষতিগ্রস্থ হওয়া বন্ধ করুন'
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.