সেড সহ একটি ফাইল থেকে এক লাইনের একটি অংশ বের করুন


18

আমি একটি ফাইল থেকে এক লাইনের একটি অংশ পড়তে চাই। উদাহরণ স্বরূপ:

POP3_SERVER_NAME = লোকালহোস্ট

আমি কেবল localhostসেড ব্যবহার করে ফিরে আসতে চাই ।

এই পাঠ্যটি তৃতীয় লাইনে রয়েছে। আমি লাইনটি বের করার জন্য এটি করি:

sed -n '3p' installation.sh

আমি কীভাবে কেবল localhostঅংশটি বের করব ?

উত্তর:


26

awk এখানে একটি ভাল সরঞ্জাম হতে পারে।

$ cat test.dat
LINE 1
LINE 2
POP3_SERVER_NAME = localhost

"POP3_SERVER_NAME" ধারণকারী লাইনগুলি অনুসন্ধান করুন; শেষ ক্ষেত্রটি মুদ্রণ করুন। এটি সর্বদা 3 লাইনে থাকা POP3_SERVER_NAME এর উপর নির্ভর করে না, এটি সম্ভবত একটি ভাল জিনিস।

$ awk '/POP3_SERVER_NAME/{print $NF}' test.dat
localhost

আপনার প্রয়োগের উপর নির্ভর করে আপনার নিয়মিত প্রকাশকে আরও কঠোর করার প্রয়োজন হতে পারে। উদাহরণস্বরূপ, আপনি কেবল সেই লাইনটিই পপ করতে চাইতে পারেন যা POP3_SERVER_NAME এর সাথে শুরু হয়।

$ awk '/^POP3_SERVER_NAME/{print $NF}' test.dat
localhost

সেড ব্যবহার করা কিছুটা স্বজ্ঞাত। (ধন্যবাদ, আমি বিড়ম্বনা সম্পর্কে অবহিত)) যে লাইনে POP3_SERVER_NAME রয়েছে সেটিকে যে কোনও জায়গায় সম্বোধন করুন। "=" অনুসরণ করে লাইনের শুরু থেকে alচ্ছিক স্থান পর্যন্ত সমস্ত পাঠ্যের জন্য একটি খালি স্ট্রিং প্রতিস্থাপন করুন। তারপরে প্রিন্ট করুন।

sed -n -e '/POP3_SERVER_NAME/ s/.*\= *//p' test.dat

2
awkকমান্ড সুন্দর - কিন্তু আপনার চারপাশের স্পেস পেয়েছেন শুধুমাত্র যদি =। এটি কাজ করবে না POP3_SERVER_NAME=localhost
মার্সেল স্টার

2
@ মার্সেল, আপনি awkস্পেস থেকে অন্য যে কোনও কিছু ব্যবহার করে ডিলিমিটার ব্যবহার করতে পারেন -F। উদাহরণস্বরূপ: আপনি যে ক্ষেত্রে উল্লেখ করেছেন সীমাবদ্ধ হিসাবে -F "="ব্যবহার করবে =
mattpr

7

pকমান্ডটি প্রতিস্থাপনের মাধ্যমে প্রতিস্থাপন করুন যা লাইনের অযাচিত অংশ সরিয়ে দেয়।

sed -n '3 s/^[^=]*= *//p' installation.sh

আপনি পজিশনের পরিবর্তে কীওয়ার্ডের সাহায্যে লাইনটি মেলাতে চাইতে পারেন।

sed -n 's/^ *POP3_SERVER_NAME *= *//p' installation.sh

6

দেখে মনে হচ্ছে আপনার কাছে একটি কনফিগার ফাইল আছে। আপনি যা করতে পারেন তা অ্যাডাম সিমিওন / এসএমএল-এর অনুরূপ:

sed -nr 's/[^=]+=\s*(.+)$/\1/p' filename

যেখানে [^=]বাদ সব '=' অক্ষর, +এক বা চরিত্রের একই ধরণের আরো, এই একটি প্রকৃত দ্বারা অনুসরণ বলেছেন =, \sকোনো হোয়াইটস্পেস (ট্যাব সহ \tএবং নতুন লাইন \n, \r\nএবং সমভূমির স্পেস '', যেহেতু *মানে শূন্য বা একই ধরণের আরো , বন্ধনীগুলি ম্যাচের চরিত্রের অনুক্রমগুলি \ 1, \ 2, ...,, n প্রতিস্থাপন স্থানধারীদের মধ্যে রাখার জন্য যা অভ্যন্তরীণ তা ধরা দেয়, $এটি একটি লাইনটির শেষে বোঝায় This এটির আদর্শ প্রতিস্থাপনের ধরণটি অনুসরণ করে: s/.../.../modifiersকমান্ড লাইন বিকল্পটি -rদাঁড়ায় এক্সটেন্ডেড রেজেক্স সিনট্যাক্স (সুবিধার্থে হিসাবে) এবং এর -nঅর্থ আউটপুট কিছুই না হওয়া পর্যন্ত বা স্পষ্টভাবে অনুরোধ করা না হওয়া পর্যন্ত পরিবর্তনটি ফলাফলটি pমুদ্রণ করে।

আপনি gমডিফায়ারের সাহায্যে বিশ্বব্যাপী অনুসন্ধান করতে পারেন:

sed -nr 's/[^=]+=\s*(.+)$/\1 /pg' filename  # note the space after \1

তাই আপনি একটি স্ট্রিং দ্বারা পৃথক পেতে যে ' '(হতে পারে \n, \t, বা কি আপনার আছে) যা আপনি সহজেই প্রক্রিয়া করতে পারি।

উভয়ই বৈধ হয় যদি আপনার মানগুলি একটি রেখার শেষ অবধি সমীকরণ চরিত্রের পূর্বে বিস্তৃত থাকে এবং মন্তব্য বা অন্যান্য অক্ষর দ্বারা অনুসরণ করা হয় না তবে একটি সাধারণ "মান" থেকে বিচ্যুত শব্দার্থবিজ্ঞান রয়েছে।


সম্পাদনা:

আমি অন্যান্য পোস্টে এখনও এখানে মন্তব্য করতে পারবেন না। রেখাটি চিহ্নিত করতে কেবল আপনার ক্ষেত্রে 3, sপ্রারম্ভিক উদ্ধৃতি চরের আগে (আগে ভিএম এর মতো) আগে লাইন নম্বরটি পাস করুন ।

sed -nr '3s/[^=]+=\s*(.+)$/\1/p' filename

দয়া করে কটাক্ষপাত করা info sed। উদাহরণস্বরূপ, 3.2 এবং 4.7 আপনার বিশেষ আগ্রহী।


5
echo "POP3_SERVER_NAME = localhost" | sed 's/.*= //'
localhost

বা যদি আপনার কোনও ফাইলে বিষয়বস্তু থাকে:

sed 's/.*= //' somefile.txt
localhost

ঠিক আছে, তবে আমি আমার ফাইলটিতে এইভাবে পড়েছি: সেড-এন '3 পি' ইনস্টলেশন.sh
মেরার্স

2
@ মেরার - উত্তরে আমি যুক্ত হওয়া আপডেটগুলি দেখুন।
slm

@ অ্যাডাম সিমিয়ন - আপনাকে ধন্যবাদ, তবে লাইন নম্বরটি কীভাবে নির্দেশ করবেন?
Mercer

4

আপনি কাট কমান্ডটি ব্যবহার করতে পারেন, '=' এ সীমানা নির্ধারণ করে এবং এর পরে দ্বিতীয় ক্ষেত্রটি এভাবে মুদ্রণ করতে পারেন:

cut -d'=' -f2

3

এটি করার একাধিক উপায়, আপনার ফাইলটিকে বিবেচনা করে বলা হয় foobar:

অনুসন্ধানের জন্য প্যাটার্নটি নির্দিষ্ট করুন:

PAT=POP3_SERVER_NAME

ব্যবহার এক্সট্রাক্ট sed

sed -n "/$PAT/p" foobar | sed "s/$PAT = //"

বা ব্যবহার sedএবংcut

sed -n "/$PAT/p" foobar | cut -d' ' -f3

2

লিনাক্স / ইউনিক্সের সৌন্দর্য হ'ল কিছু সাধারনত একাধিক উপায় থাকে। অপটির ক্ষেত্রে, ফাইল থেকে পিওপি সার্ভারের নাম আহরণের কমপক্ষে চারটি ভিন্ন উপায় রয়েছে:

  1. grep POP3_SERVER_NAME installation.sh | cut -d'=' -f2
  2. grep POP3_SERVER_NAME installation.sh | awk '{print $3}'
  3. grep POP3_SERVER_NAME installation.sh | sed 's/.*= //'
  4. sed -n 's/^.*POP3_SERVER_NAME = //p' installation.sh
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.