গ্রেপ / সেড / অ্যাজকি ব্যবহার করে স্ট্রিং থেকে শব্দটি বের করুন


12

আমার একটা স্ট্রিং আছে

00:28:04 /usr/lib/jvm/jre/bin/java -DJDBC_CONNECTION_STRING= -Dspring.profiles.active=qa -XX:MaxPermSize=256

এবং qaনিম্নলিখিত শব্দটি বের করতে চাই -Dspring.profiles.active।

আমার কাছে স্ট্রিংটি একটি ফাইল টেক্সট-টেক্সটে সংরক্ষণ করা আছে কেবল এটির ডেমো করার জন্য।

যখন আমি করি

grep -r -o "spring.profiles.active=" text.txt

ফলাফল হলো spring.profiles.active=

এই শব্দটি সবসময় হয় না qa, এটি হতে পারে prodবা dev।

আমি কি করতে চাই শব্দ খুঁজতে spring.profiles.activeএবং পরে= নির্যাস যে শব্দ।

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

এটি কি সম্ভব এবং যদি তাই হয় তবে আমি এটি কীভাবে করব।


আমি অনুমান করছি যে এটি সম্পর্কে ইতিমধ্যে মেটা কথোপকথন হয়েছে, তবে এই প্রশ্নটি উবুন্টুর কাছে সম্পূর্ণ অ-নির্দিষ্ট। কেন এটি এখানে ইউনিক্স.স্ট্যাকেক্সেঞ্জ ডটকমের পরিবর্তে ?
— টনি অ্যাডামস

@ টনিএডামস হ্যাঁ আছে: পাঠ্য-প্রক্রিয়াজাতকরণের প্রশ্নগুলি এখানে অপ্রত্যক্ষভাবে আচ্ছাদিত করা হয়েছে এবং যাইহোক, ডি-ফ্যাক্টো যেহেতু এগুলি সর্বদা বিষয়-বিবেচনা করা হয়েছে এবং কখনও বন্ধ / মাইগ্রেট করা হয়নি; উবুন্টু-নির্দিষ্টকরণের উপর, যা একাধিকবার coveredাকা পড়েছে, সম্প্রতি দু'বারে এখানে এবং নকল এবং একবার এখানে ।
— kos

ভাল প্রশ্ন! : ডি
— এনকম্পিউটারগুলি

উত্তর:


20

আপনি grepপিসিআরই ( -P) এর সাথে ব্যবহার করতে পারেন :

grep -Po 'spring.profiles.active=\K[^ ]+' <<<'.....string.....'
  • spring.profiles.active=আক্ষরিকভাবে এই স্ট্রিংয়ের \Kসাথে মিলবে, ম্যাচটি বাতিল করে দেবে

  • [^ ]+spring.profiles.active=পরের স্থান পর্যন্ত পছন্দসই অংশ অর্থাৎ অংশ পরে নির্বাচন করবে

একটি ফাইলের জন্য:

grep -Po 'spring.profiles.active=\K[^ ]+' file.txt

উদাহরণ:

% grep -Po 'spring.profiles.active=\K[^ ]+' <<<'00:28:04 /usr/lib/jvm/jre/bin/java -DJDBC_CONNECTION_STRING= -Dspring.profiles.active=qa -XX:MaxPermSize=256'
qa

sed অনুরূপ যুক্তি গ্রহণ করবে:

sed -r 's/.*spring.profiles.active=([^ ]+).*/\1/' <<<'.....string.....'

উদাহরণ:

% sed -r 's/.*spring.profiles.active=([^ ]+).*/\1/' <<<'00:28:04 /usr/lib/jvm/jre/bin/java -DJDBC_CONNECTION_STRING= -Dspring.profiles.active=qa -XX:MaxPermSize=256'
qa

হ্যান্ডলিং ত্রুটি:

আপনার স্ক্রিপ্টে আপনি কেসটি হ্যান্ডেল করতে চাইতে পারেন যেখানে কোনও মিল নেই, অন্যথায় যেখানে আপনার মূল স্ট্রিং থাকে না spring.profiles.active=। উপরের sedউদাহরণে, আপনি পুরো মূল স্ট্রিংটি পান, যা সমস্যা তৈরি করতে পারে:

% var="$(sed -r 's/.*spring.profiles.active=([^ ]+).*/\1/' <<<'00:28:04 /usr/lib/jvm/jre/bin/java -DJDBC_CONNECTION_STRING= -XX:MaxPermSize=256')"
% echo $var
00:28:04 /usr/lib/jvm/jre/bin/java -DJDBC_CONNECTION_STRING= -XX:MaxPermSize=256

কোনও মিল না থাকলে আপনি যদি খালি স্ট্রিং পেতে -nপছন্দ করেন তবে sedকমান্ডের pবিকল্পটি এবং কমান্ডের বিকল্পটি যুক্ত করুন sed s:

% var="$(sed -rn 's/.*spring.profiles.active=([^ ]+).*/\1/p' <<<'00:28:04 /usr/lib/jvm/jre/bin/java -DJDBC_CONNECTION_STRING= -XX:MaxPermSize=256')"
% echo $var

% var="$(sed -rn 's/.*spring.profiles.active=([^ ]+).*/\1/p' <<<'00:28:04 /usr/lib/jvm/jre/bin/java -DJDBC_CONNECTION_STRING= -Dspring.profiles.active=qa -XX:MaxPermSize=256')"
% echo $var
qa

তারপরে আপনি পরীক্ষা করতে পারেন $ var খালি কিনা।


ধন্যবাদ @ হাইমা, নিখুঁত কাজ করে। এখন আমার এটি স্ক্রিপ্ট করা দরকার। আমি উত্তর হিসাবে এটি চিহ্নিত করব
— Gman

@ হিমায়ে আপনি কি জানবেন আমি কীভাবে এটি স্ক্রিপ্ট করতে পারি? আমার কাছে এটি একটি স্ক্রিপ্টে রয়েছে এবং এটি যখন চলে তখন এটি QA ফেরত দেয়। আমি ফলটি এনভ নামে পরিচিত একটি ভেরিয়েবলে সংরক্ষণ করতে এবং তারপরে এটির সাথে অন্যরকম কিছু তুলনা করতে চাই। যদি [env == qa]; তারপরে // কিছু করুন ... অন্য কিছু করুন ...
— Gman

1
@Gman হ্যাঁ .. শুধু কমান্ড প্রতিকল্পন ব্যবহার করুন: var="$(grep -Po 'spring.profiles.active=\K[^ ]+' file.txt)"প্রতিস্থাপন file.txtসঙ্গে <<<'...string...'যদি ইনপুট একটি স্ট্রিং, না একটি file..then আপনি কি করতে পারেনif [ "$var" = 'qa' ]; then do something; else do something; fi
— heemayl

1

ব্যবহার awk

awk -F"-Dspring.profiles.active=" '{sub(/ .*/,"",$2);print $2}' <<<'your_string'

অথবা

awk -F"-Dspring.profiles.active=" '{sub(/ .*/,"",$2);print $2}' your_file

উদাহরণ

% awk -F"-Dspring.profiles.active=" '{sub(/ .*/,"",$2);print $2}' <<<'00:28:04 /usr/lib/jvm/jre/bin/java -DJDBC_CONNECTION_STRING= -Dspring.profiles.active=qa -XX:MaxPermSize=256'
qa

1

আমি পার্লটিকে মিশ্রণে ফেলে দেব:

<<<'string' perl -lane '$F[3]=~s/.*?=//;print($F[3])'
  • -l: স্বয়ংক্রিয় লাইন-এন্ডিং প্রসেসিং সক্ষম করে। এর দুটি পৃথক প্রভাব রয়েছে। প্রথমে, -n বা -p ব্যবহার করার পরে এটি স্বয়ংক্রিয়ভাবে ps / (ইনপুট রেকর্ড বিভাজক) চম্পস করে। দ্বিতীয়ত, এটি t \ (আউটপুট রেকর্ড বিভাজক )কে অক্টনামের মান রাখার জন্য নির্ধারিত করে যাতে কোনও মুদ্রণ বিবরণীতে সেই বিভাজকটিকে আবার যুক্ত করা যায়। যদি অক্টনাম বাদ দেওয়া হয় তবে $ \ কে বর্তমান মান $ / সেট করে।
  • -a: যখন -n বা -p ব্যবহার করা হয় তখন অটোস্প্লিট মোড চালু করে। @F অ্যারেতে একটি অন্তর্নিহিত স্প্লিট কমান্ডটি অন্তর্নিহিত অভ্যন্তরের মধ্যে প্রথম জিনিস হিসাবে সম্পন্ন করা হয় যখন -n বা -p দ্বারা উত্পাদিত লুপ হয়।
  • n: পার্লকে আপনার প্রোগ্রামের চারপাশে নিম্নলিখিত লুপটি ধরে নিয়েছে, যা এটি ফাইল-নাম যুক্তিগুলিকে কিছুটা সেড-এন বা অ্যাজকের মাধ্যমে পুনরাবৃত্তি করে তোলে:

    LINE:
      while (<>) {
          ...             # your program goes here
      }
  • -e: প্রোগ্রামের এক লাইনে প্রবেশের জন্য ব্যবহৃত হতে পারে।
% <<<'00:28:04 /usr/lib/jvm/jre/bin/java -DJDBC_CONNECTION_STRING= -Dspring.profiles.active=qa -XX:MaxPermSize=256' perl -lane '$F[3]=~s/.*?=//;print($F[3])'
qa

perl -nle '/spring.profiles.active=\K([^ ]+)/ && print $1' <<<'00:28:04 /usr/lib/jvm/jre/bin/java -DJDBC_CONNECTION_STRING= -Dspring.profiles.active=qa -XX:MaxPermSize=256'
— অরজিনাল রেইজেক্স এটির মতোও
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.