पीएस कमांड से एक प्रमुख मूल्य जोड़ी कैसे निकालें


10

मैं psइस तरह से कमांड से आवेदन नाम निकालने की कोशिश कर रहा हूं :

ps -af -u sas |grep "java"| grep -v "grep"

और यह निम्नलिखित उत्पादन करता है:

sas 24431     1  0 Oct10 ?        00:51:08 /usr/lib/jvm/java-1.7.0-oracle-1.7.0.25.x86_64/jre/bin/java -Denv=DEV -Dapp.name=myApp -Xms512m -Xmx1g -Dlog.dir=/apps/java/logs

मैंने प्रयोग करने की कोशिश की, egrepलेकिन काम नहीं कर रहा है:

ps -af -u sas|grep "java"| grep -v "grep"| egrep -o "-Dapp.name"

मैं केवल -Dapp.name"myApp" मूल्य कैसे प्राप्त कर सकता हूं ?


यदि grepपैटर्न के साथ शुरू होता है -, तो आपको -eविकल्प के बाद इसे रखना होगा । अन्यथा, इसे एक विकल्प के रूप में माना जाएगा। लेकिन यह सिर्फ शब्द से मेल खाएगा -Dapp.name, इसके बाद का हिस्सा नहीं।
बामर

वैकल्पिक रूप से:grep -o -- -Dapp.name
आवारा

आप grep [j]avaकमांड से बचने के लिए उपयोग कर सकते हैं grep -v "grep"(बैश पर परीक्षण किया गया है)
HVNSweeting

जवाबों:



8

आप त्रुटि संदेश आपको नहीं दिखा रहे हैं, लेकिन यह शायद है

grep: अज्ञात उपकरण विधि

ऐसा इसलिए है, क्योंकि सभी या कम से कम अन्य कमांड लाइन कार्यक्रमों की तरह, grepयह मान लेता है कि जो कुछ भी एक के साथ शुरू होता है -वह एक विकल्प है और इस तरह से पार्स करने की कोशिश करता है। इस मामले में, डिवाइस फ़ाइल ( विवरण के लिए देखें) से निपटने के तरीके के बारे में -Dनिर्देश देने के लिए उपयोग किया जाता है । इसके चारों ओर जाने का एक तरीका यह है कि यह बताया जाए कि निम्नलिखित कुछ भी विकल्प नहीं है।grepman grep--grep

जीएनयू की पीसीआरई क्षमता के साथ संयोजन grep, आप कर सकते हैं:

ps -af -u sas | grep -v grep | grep -Po -- '*-\KDapp.name=[^\s]+'

नियमित अभिव्यक्ति के लिए खोज करता है -और इसे छोड़ देता है ( \K), फिर स्ट्रिंग के Dapp.name=रूप में संभव के रूप में कई गैर-अंतरिक्ष अक्षर। आउटपुट है:

Dapp.name=myApp

यदि आप myAppकिसी चर में सहेजा गया भाग चाहते हैं , तो मैं उस अकेले को खोजूंगा:

ps -af -u sas | grep -v grep | grep -Po -- '-Dapp.name=\K[^\s]+'

इसे एक चर में निर्दिष्ट करने के लिए:

$ app="$(ps -af -u sas | grep -v grep | grep -Po -- '-Dapp.name=\K[^\s]+')"
$ echo $app
myApp

हालाँकि, आपको इस तरह की चीज़ grepके psलिए कभी आउटपुट नहीं देना चाहिए , यही pgrepहै:

app="$(pgrep -a java | grep -Po -- '^Dapp.name=\K[^\s]+')"


3

किसी भी समय आप का उपयोग करें ps … | grep …और परिणाम से grep को बाहर करने की जरूरत है, आप इसे गलत कर रहे हैं।

के उत्पादन को पार्स करने का शून्य नियम psअधिक विश्वसनीय उपकरणों का उपयोग करना है जैसे pgrepकि उपलब्ध है। यदि आपके पास pgrep है, तो pgrep -f javaकमांड चलाने वाली सभी प्रक्रियाओं को सूचीबद्ध करता है java। विकल्प -lप्रत्येक प्रक्रिया के लिए कमांड लाइन जोड़ता है।

तर्क को निकालने के लिए -Dapp.name, आप sed का उपयोग कर सकते हैं। पूरी लाइन से मिलान करें, एक समूह में दिलचस्प भाग को सामान करने की व्यवस्था करें, और उस समूह का प्रिंट आउट लें।

pgrep -lf java | sed -n 's/^.*-Dapp\.name=\([^ ]*\).*$/\1/p'

आउटपुट को पार्स करने का पहला नियम उन फ़ील्ड का चयन करने के psलिए विकल्प -oका उपयोग करना है जिनकी आपको आवश्यकता है। यहां, आप केवल कमांड तर्कों में रुचि रखते हैं, इसलिए केवल वही प्रिंट करें।

ps -e -o args= | sed -n 's/^.*-Dapp\.name=\([^ ]*\).*$/\1/p'

3

अन्य उत्तरों की तुलना में अधिक जटिल है, लेकिन यह getoptआपके लिए पार्सिंग को संभालने के लिए उपयोग करता है। फिर भी एक और विकल्प।

getopt -aql 'Dapp.name:' $(\
    ps -af -u sas | grep java | grep -v grep | tr -s ' ' | cut -d' ' -f8-\
) | cut -d"'" -f2
  1. आपकी आज्ञा: ps -af -u sas | grep java | grep -v grep
  2. tr -s ' ' की तैयारी में एक ही स्थान में कई जगह "निचोड़" cut
  3. cut -d' ' -f8- रिक्तियों द्वारा लाइन को विभाजित करता है और 8 समावेशी के बाद सभी क्षेत्रों को पकड़ता है, परिणाम है /usr/lib/jvm/java-1.7.0-oracle-1.7.0.25.x86_64/jre/bin/java -Denv=DEV -Dapp.name=myApp -Xms512m -Xmx1g -Dlog.dir=/apps/java/logs
  4. getopts -aql 'Dapp.name:' $(...)आदेश विकल्पों को पार्स करता है और केवल उसी लॉन्गनेम को आउटपुट करता है जिसका मिलान होता Dapp.nameहै जिसका मूल्य (द्वारा निरूपित :) होता है, परिणाम है--Dapp.name 'myApp' --
  5. cut -d"'" -f2 एकल उद्धरण में सामान पकड़ लेता है
  6. परिणाम है: myApp

0

मैं pgrepइसके बजाय उपयोग करना psचाहूंगा:

$ pgrep -fa java | grep -op "(<=-Dapp.name=)\w+"

यह उन सभी प्रक्रियाओं को लौटाएगा जो मेल खाते हैं javaऔर फिर उन लोगों को दिखाते हैं जो केवल होते हैं -Dapp.name=। अंतिम बिट, \w+प्रोग्राम का नाम दिखाएगा, यह मानते हुए कि इसमें कोई स्थान नहीं है।

नोट:-P स्विच करने के लिए grepसूचीबद्ध का उपयोग कर बातें निर्दिष्ट करने की क्षमता PCRE - पर्ल कम्पैटिबल रेग्युलर एक्सप्रेशंस । सभी संस्करण grepइसका समर्थन नहीं करते हैं, लेकिन अधिकांश ऐसे हैं जो लिनक्स के अधिक आधुनिक संस्करणों के साथ शामिल हैं।

यदि आप संपूर्ण कुंजी / मान आउटपुट चाहते हैं तो चीजों को बदल दें जैसे:

$ pgrep -fa java | grep -oP -- "-Dapp.name=\w+"
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.