आउटपुट में एक विशिष्ट भाग प्रिंट करें


11

आइए मान लें कि एक कमांड है जैसे:

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

आउटपुट इस प्रकार है:

CONFIG_ARCH_DEFCONFIG="arch/x86/configs/x86_64_defconfig"

अब, मेरा प्रश्न यह है: क्या कोई कमांड है जो केवल प्रिंट करेगा जो उल्टे अल्पविराम के अंदर है, अर्थात " "?

और क्या आप कृपया कमांड को थोड़ा समझा सकते हैं? धन्यवाद! अग्रिम रूप से।


5
ध्यान दें कि catपाइप में उपयोग करना लगभग हमेशा संसाधनों की बर्बादी (AKA UUOC ) है; grepकिसी फ़ाइल से उसका इनपुट पहले से ही पढ़ सकता है (यानी grep CONFIG_ARCH_DEFCONFIG /boot/config-3.19.0-32-genericबिल्कुल वही काम करता है, लेकिन 1. यह छोटा है। यह समझना आसान है 3. यह एक अतिरिक्त शेल और एक अतिरिक्त प्रक्रिया को कांटा नहीं करता है)। 99% मामलों में, कई फ़ाइलों को समेटे बिना पाइप के शुरू में बिल्ली का उपयोग करना सिर्फ हानिकारक है। :)
कोस

@kos - थैंक्स! नहीं जानता था कि जैसा मैंने अभी-अभी linux का उपयोग शुरू किया है। इसे ध्यान में रखेंगे।
राफेल

Np! मैं इस सवाल पर ठोकर खा रहे अन्य लोगों के लिए अपनी टिप्पणी ऊपर छोड़ रहा हूं।
कोस

प्रारंभिक cat, हालांकि इस मामले में बेकार है, भविष्य में आदेशों की पूरी पंक्ति को संपादित करना आसान बना देगा, यदि आप बाद में कुछ बदलना / जोड़ना / हटाना चाहते हैं, तो शायद , trया cut, फ़ाइल नाम खोजने और स्थानांतरित करने की आवश्यकता नहीं है। सुनिश्चित करें कि अन्य कमांड इसका समर्थन करता है, यह पता लगाएं कि इसे कहां रखा जाए, आदि और एक छोटी परीक्षण फ़ाइल के लिए यह केवल 0.002s जोड़ता है। (मैंने शायद अधिक समय इसे टाइप करने में बिताया है, जिससे मैं कभी भीcat
अतिव्यस्तता

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}'क्षेत्र विभाजक के बाद दूसरे सेट को प्रिंट करने के लिए awk बताता है।

उम्मीद है की यह मदद करेगा!


14
@Terrance, इस मामले में इस का एक बेकार इस्तेमाल होता है catऔर grep। आप के साथ बदल सकते हैं catऔर grepभाग सकते हैं awk -F'"' '/CONFIG_ARCH_DEFCONFIG/{print $2}' /boot/config-3.19.0-32-generic । कम प्लंबिंग, AWK को हर काम करने देता है, जो यह करने में सक्षम है
सर्गी कोलोडियाज़नी

@ शेर के साथ सहमत
तुंग ट्रान

@ कोई समस्या नहीं है। तुम्हारे द्वारा कहा गया मेरी समझ में आ रहा है। मैं केवल कमांड पर जोड़कर उसकी मूल कमान को जोड़ रहा था 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

मुझे एक ही परिणाम प्राप्त करने के लिए एक से अधिक तरीके सीखने से प्यार है। बहुत बढ़िया जवाब! =)
टेरेन्स

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
मुझे पता था कि आप किसी बिंदु पर शामिल होंगे: P +1
heemayl

तब मैं एक अजगर कोड का निर्माण करूंगा ..
अविनाश राज

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]
अविनाश राज

@AvashRaj अच्छा सामान, देखभाल कृपया इस पोस्ट करने के लिए? मैं एक के साथ ही regex पोस्ट किया है।
सर्गी कोलोडियाज़नी

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
आप regexd के लिए जाने की जरूरत नहीं है, बस मेरा उपयोग करें, line.startswithक्योंकि re.matchकी तुलना में बहुत धीमी हैstartswith
अविनाश राज
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.