একটি আউটপুট একটি নির্দিষ্ট অংশ মুদ্রণ


11

আমাদের ধরুন যে এখানে একটি কমান্ড রয়েছে:

cat /boot/config-3.19.0-32-generic | grep CONFIG_ARCH_DEFCONFIG

আউটপুট যেমন:

CONFIG_ARCH_DEFCONFIG="arch/x86/configs/x86_64_defconfig"

এখন, আমার প্রশ্নটি হ'ল: এমন কোনও কমান্ড রয়েছে যা কেবল উল্টানো কমাগুলির ভিতরে যা প্রিন্ট করবে " "?

এবং আপনি দয়া করে কমান্ডটি একটু ব্যাখ্যা করতে পারেন? ধন্যবাদ! অগ্রিম.


5
নোট করুন যে catপাইপে ব্যবহার করা প্রায় সর্বদা সম্পদের অপচয় ( একে একে ইউইউসি ) হয়; grepএর ইনপুটটি ইতিমধ্যে একটি ফাইল থেকে পড়তে পারে (যেমন grep CONFIG_ARCH_DEFCONFIG /boot/config-3.19.0-32-genericঠিক একই জিনিসটি করে তবে 1 টি ছোট) এটি আরও সহজে বোঝা যায় 3. এটি একটি অতিরিক্ত শেল এবং একটি অতিরিক্ত প্রক্রিয়া কাঁটাচামচ করে না)। 99% ক্ষেত্রে, একাধিক ফাইলকে সম্মতি না দিয়ে পাইপের শুরুতে বিড়াল ব্যবহার করা কেবল ক্ষতিকারক। :)
কোস

@ কোস - থ্যাঙ্কস! আমি যেমন সদ্য লিনাক্স ব্যবহার শুরু করেছি তা জানেন না। মনে রাখবে।
রাফেল

NP! এই প্রশ্নটি জুড়ে অন্য লোকেরা হোঁচট খাওয়ার জন্য আমি উপরে আমার মন্তব্য রেখে চলেছি।
কোস

প্রারম্ভিক cat, যদিও এই ক্ষেত্রে অকেজো, আপনি ভবিষ্যতে কমান্ডের পুরো লাইনটি সম্পাদনা করা আরও সহজ করে তুলবেন যদি আপনি পরে কিছু পরিবর্তন / যুক্ত / সরাতে চান, সম্ভবত একটি trবা cut, ইত্যাদি, ফাইলের নাম সন্ধান এবং সরিয়ে না নিতে , নিশ্চিত করুন যে অন্য কমান্ড এটি সমর্থন করে, এটি কোথায় স্থাপন করবে ইত্যাদি And (অনাবশ্যকতা এড়ানো থেকে আমি আজীবন সাশ্রয় করি তার চেয়ে আমি সম্ভবত টাইপ করার জন্য আরও বেশি সময় ব্যয় করেছি cat)
Xen2050

1
@ Xen2050 catএখানে কেন সহায়তা করে ? আপনি করতে পারবেন grep foo file | trবা ... | cutঠিক তত সহজেই cat file | tr | grep ...catশুধু একটি অতিরিক্ত পাঁচটি অক্ষর, একটি অতিরিক্ত পাইপ এবং একটি অতিরিক্ত প্রোগ্রাম কল যোগ করা হয়েছে এবং না প্রক্রিয়া সহজ কিছু।
টেরডন

উত্তর:


15

হ্যাঁ, আপনি এটি করতে পারেন। আপনার আদেশ হবে:

cat /boot/config-3.19.0-32-generic | grep CONFIG_ARCH_DEFCONFIG | awk -F'"' '{print $2}'

যা কেবল ফিরে আসবে:

arch/x86/configs/x86_64_defconfig

awkআদেশের সঙ্গে ক্ষেত্র বিভাজক ব্যবহার -Fকমান্ড, এবং, ডবল কোট ব্যবহার করার জন্য এটি সেট করতে আপনার মত এটি প্রায় একক কোট দিয়ে আর টাইপ -F'"'। তারপরে '{print $2}'ফিল্ড বিভাজকের পরে দ্বিতীয় সেটটি মুদ্রণ করতে অ্যাডকে বলুন।

আশাকরি এটা সাহায্য করবে!


14
@ টার্নেন্স, এক্ষেত্রে এটি catএবং এর অকেজো ব্যবহার grep। আপনি প্রতিস্থাপন catএবং grepঅংশ হতে পারে awk -F'"' '/CONFIG_ARCH_DEFCONFIG/{print $2}' /boot/config-3.19.0-32-generic । কম নদীর গভীরতানির্ণয়, এডাব্লুকে সমস্ত কাজ করতে দেওয়া, যা এটি করার চেয়ে বেশি দক্ষ
সের্গি কলডিয়্যাজহনি

@ সার্গের সাথে সম্মত হন
টুং ট্রান

@ সার্জ কোন সমস্যা নেই আমি বুঝতে পারছি তুমি কি বলছ। আমি কেবলমাত্র কমান্ডটি যুক্ত করে তার আসল কমান্ডে যুক্ত করেছিলাম awk। =)
টেরেন্স

11

আপনি একক grepআদেশ দিয়ে এটি করতে পারেন :

grep -Po '^CONFIG_ARCH_DEFCONFIG="\K[^"]*' /boot/config-3.19.0-32-generic

অথবা (কিছুটা দীর্ঘ এবং আরও বেশি দণ্ডিত):

grep -Po '^CONFIG_ARCH_DEFCONFIG="\K.*?(?=")' /boot/config-3.19.0-32-generic
  • -P: grepপ্যাটার্নটিকে পিসিআরই (পার্ল সামঞ্জস্যপূর্ণ নিয়মিত এক্সপ্রেশন) হিসাবে ব্যাখ্যা করতে বলে ;
  • -o: grepকেবল ম্যাচ মুদ্রণ করতে বলে ;
  • ^CONFIG_ARCH_DEFCONFIG=": CONFIG_ARCH_DEFCONFIG="লাইনের শুরুতে একটি স্ট্রিংয়ের সাথে মেলে ;
  • \K: পূর্বে মিলিত সাবস্ট্রিং বাতিল করে;

# 1:

  • [^"]*: কোনও চরিত্রের সংখ্যার সাথে মেলে "(লোভের সাথে)।

# 2:

  • .*?: যে কোনও চরিত্রের (অলস) সাথে মেলে;
  • (?="): লুকেহেড (শূন্য-দৈর্ঘ্য দাবী, এটি কোনও চরিত্রের সাথে মেলে না); নিম্নলিখিত অক্ষরটি যদি একটি হয় তবে মেলে "
% grep -Po '^CONFIG_ARCH_DEFCONFIG="\K[^"]*' /boot/config-4.2.0-16-generic
arch/x86/configs/x86_64_defconfig
% grep -Po '^CONFIG_ARCH_DEFCONFIG="\K.*?(?=")' /boot/config-4.2.0-16-generic
arch/x86/configs/x86_64_defconfig

একই ফলাফল অর্জনের জন্য আমি একাধিক উপায় শিখতে পছন্দ করি। দুর্দান্ত উত্তর! =)
Terrance

10

এই বিড়ালটির ত্বকের বিভিন্ন উপায় রয়েছে, এখানে একটি sedউপায়:

sed -nr 's/^CONFIG_ARCH_DEFCONFIG="([^"]+)"$/\1/p' /boot/config-3.19.0-32-generic

এখানে আমরা লাইনটির সাথে মিল করছি এবং কাঙ্ক্ষিত অংশটি অর্থাৎ ডাবল কোট ( ([^"]+)) এর অংশটি ক্যাপচার করছি এবং তারপরে পুরো লাইনটি কেবলমাত্র বন্দী গোষ্ঠী ( \1) এর সাথে প্রতিস্থাপন করব ।

উদাহরণ:

% sed -nr 's/^CONFIG_ARCH_DEFCONFIG="([^"]+)"$/\1/p' /boot/config-3.13.0-32-generic
arch/x86/configs/x86_64_defconfig

10

কি, না perl?

grep CONFIG_ARCH_DEFCONFIG /boot/config-3.19.0-32-generic | 
    perl -pe 's/.*?"([^"]*).*/$1/'

perlহবে -pস্ক্রিপ্ট দেওয়া প্রয়োগের পরে যে লাইন দ্রণ -es/foo/bar/প্রতিস্থাপন করে দেবে fooসঙ্গে bar। বন্ধনীর মধ্যে প্যাটার্নস "ব" এবং হিসাবে উল্লেখ করা যেতে পারে $1, $2... $Nযেখানে $11 ম প্যাটার্ন বন্দী করা হয়, $2দ্বিতীয় ইত্যাদি রেগুলার এক্সপ্রেশন সব কিছুর জন্য দেখবে পর্যন্ত প্রথম উদ্ধৃতি ( .*?"), তারপর 0 বা আরো অ- ক্যাপচার "অক্ষর ( [^"]*) এবং তারপরে সমস্ত কিছু। পুরো জিনিসটি ক্যাপচার করা প্যাটার্নের সাথে প্রতিস্থাপিত হয়।

আপনি এর সাথে মেলে এমন প্যাটার্নটিও ছেড়ে দিতে পারেন perl:

perl -ne 's/.*CONFIG_ARCH_DEFCONFIG="([^"]*).*/$1/ && print' /boot/config-3.19.0-32-generic

2
আমি জানতাম আপনি যে কোনও মুহুর্তে যোগদান করবেন: পি +1
হিমাইল

তাহলে আমি একটি অজগর কোড তৈরি করবো ..
অবিনাশ রাজ

with open('/boot/config-3.19.0-32-generic') as f: for line in f: if line.startswith('CONFIG_ARCH_DEFCONFIG'): print line.split('"')[1]
অবিনাশ রাজ

@ অবিনাশরাজ ভাল জিনিস, এই পোস্ট করতে যত্ন দয়া করে? আমি রেগেক্সের সাথে একটি পোস্ট করেছি।
সের্গেই কোলোডিয়াজনি

8

এখানে একটি সংমিশ্রণ grepএবং cutএটি একই কাজ করে।

$ grep "CONFIG_ARCH_DEFCONFIG" /boot/config-3.19.0-32-generic | cut -d"\"" -f2                                                
arch/x86/configs/x86_64_defconfig

ব্যাখ্যা:

  • grep "CONFIG_ARCH_DEFCONFIG" /boot/config-3.19.0-32-genericঅংশ যে লাইন খুঁজে বের করে, মানক, grep সিনট্যাক্স রয়েছে: grep [OPTIONS] PATTERN [FILE...]। পাইপ মাধ্যমে আউটপুট পরবর্তী পর্যায়ে যায়
  • cut -d"\"" -f2। এই অংশটি কাট থেকে কাটা টেক্সট নির্দিষ্ট ডিলিমিটার (যা -dপতাকা সহ নির্দিষ্ট করা হয় ) দ্বারা পৃথক করে ব্যবহার করে । আমাদের ব্যাকস্ল্যাশ সহ ডাবল উদ্ধৃতি থেকে বাঁচতে হবে যাতে শেল cutশেলটি নিজেই ইনপুট না করে কমান্ডের বিকল্পগুলির মধ্যে একটি হিসাবে ডাবল উদ্ধৃতি গ্রহণ করতে দেয় । এখন cutথেকে আউটপুট বিবেচনা করবে grepযেমন দ্বারা পৃথক "তিনটি কলাম, মধ্যে এবং বিভক্ত CONFIG_ARCH_DEFCONFIG, arch/x86/configs/x86_64_defconfigএবং খালি স্থান। আমাদের যে রেখাটি দরকার তা হ'ল দ্বিতীয় কলাম, এর অর্থ আমাদের -f2পতাকা ব্যবহার করা দরকার ।

3

যেহেতু আমি বর্তমানে pythonএখানে শিখছি সেটি হ'ল একটি সংস্করণ।

#!/usr/bin/env python
import re

reg = re.compile('CONFIG_ARCH_DEFCONFIG')

with open("/boot/config-3.19.0-32-generic") as file :
   for line in file:
       if reg.match(line):
           print line.split('"')[1]

নমুনা রান:

DIR:/TECH-BOOKS
skolodya@ubuntu:$ ./extractString.py                                           
arch/x86/configs/x86_64_defconfig

DIR:/TECH-BOOKS
skolodya@ubuntu:$ cat ./extractString.py                                       
#!/usr/bin/env python
import re

reg = re.compile('CONFIG_ARCH_DEFCONFIG')

with open("/boot/config-3.19.0-32-generic") as file :
   for line in file:
       if reg.match(line):
           print line.split('"')[1]

অজগরটিতে ইনডেন্টেশন খুব 7 খুব গুরুত্বপূর্ণ ..
অবিনাশ রাজ

1
আপনাকে রেজেক্সডের জন্য যেতে হবে না, শুধু আমার ব্যবহার করুন, line.startswithকারণ এর re.matchচেয়ে অনেক ধীরstartswith
অবিনাশ রাজ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.