2010-09-24 17 views
6

मेरे पास एक छोटी बैश स्क्रिप्ट है जो एक कीवर्ड का उपयोग करके greps/awk अनुच्छेद है।एडब्ल्यूके आउटपुट को चर में कैसे पास किया जाए?

लेकिन अतिरिक्त कोड में जोड़ने के बाद: set var = "(......)" यह केवल एक रिक्त पंक्ति और नहीं अनुच्छेद प्रिंट करता है।

तो मैं पूछना चाहता है, तो किसी को भी जानता है कि कैसे ठीक से outputting के लिए एक चर में awk उत्पादन पारित करने के लिए चाहते हैं?

मेरे कोड:

#!/bin/sh 

set var = "(awk 'BEGIN{RS=ORS="\n\n";FS=OFS="\n"}/FileHeader/' /root/Desktop 
/logs/Default.log)" 
echo $var; 

धन्यवाद!

+2

इसे चर के चारों ओर हमेशा डबल कोट्स रखने की आदत बनाएं: 'echo "$ var" '। यह आम तौर पर रिक्त स्थान वाले फ़ाइल नाम वाले उपयोगकर्ताओं को काटता है। –

उत्तर

5

उपयोग command substitution एक प्रक्रिया के उत्पादन में कब्जा करने के लिए।

#!/bin/sh 

VAR="$(awk 'BEGIN{RS=ORS="\n\n";FS=OFS="\n"}/FileHeader/' /root/Desktop/logs/Default.log)" 
echo "$VAR" 

शेल पटकथा लेखन के संबंध में कुछ सामान्य सलाह:

  • (लगभग) हमेशा हर चर संदर्भ बोली।
  • कभी नहीं डाल बराबरी के साथ स्पेस चर काम में प्रवेश करें।
+0

काम कर सकता नहीं "लाइन 5: awk शुरू {रुपये = ओआरएस = \ n \ n: आदेश नहीं मिला" ... – JavaNoob

+2

उपयोग $() जहां भी संभव हो! – ghostdog74

+1

@JavaNoob, आपको बैकटिक्स के अंदर बैकस्लाश के साथ सावधान रहना होगा। यहां देखें http://mywiki.wooledge.org/BashFAQ/082 – lesmana

3
  • आपको "कमांड प्रतिस्थापन" का उपयोग करने की आवश्यकता है। आदेश को बैकटिक्स, `COMMAND` या किसी डॉलर चिह्न से पहले कोष्ठक की एक जोड़ी में रखें, $(COMMAND)
  • एक चर आप set का उपयोग नहीं करते सेट करने के लिए और आप से पहले और = के बाद रिक्त स्थान नहीं हो सकता।

इस प्रयास करें:

var=$(awk 'BEGIN{RS=ORS="\n\n";FS=OFS="\n"}/FileHeader/' /root/Desktop/logs/Default.log) 
echo $var 
2

तुम मुझे एक ऐसी प्रक्रिया है :) हत्या के लिए इस का विचार प्रदान किया। बस क्रोमियम जो भी प्रक्रिया आप मारना चाहते हैं। एक चर तिजोरी/Hashicorp, से आ रही है जब, पैकर टेम्पलेट वैरिएबल का उपयोग कर तो जैसे बनाने के लिए

VAR=$(ps -ef | grep -i chromium | awk '{print $2}'); kill -9 $VAR 2>/dev/null; unset VAR; 
+0

आप आम तौर पर 'ps -C 'तर्क का उपयोग करना चाहते हैं, जैसा कि' ps-c क्रोमियम 'में है।इस तरह पीएस आउटपुट के साथ grep का उपयोग करना अंततः वापस आने के लिए वापस आ जाएगा जब एक फ़ाइल नाम vim में खुलता है या जो कुछ आप कमांड के लिए grepping से मेल खाता है। और आप निर्दिष्ट कर सकते हैं कि केवल पीआईडी ​​आउटपुट में हो, 'ps-c chromium -o pid = 'का उपयोग करके अजीब बचत। – dannysauer

+0

या बस 'killall क्रोमियम' का उपयोग करें, मुझे लगता है;) – dannysauer

0

प्रयास करें:

इस प्रयास करें साथ

BUILD_PASSWORD=$(vault read secret/buildAccount| grep ^password | awk '{print $2}') 
echo $BUILD_PASSWORD 

आप कर सकते हैं एक ही करने के लिए grep ^user

1

जब भी आप grep को अजीब पाइप देखते हैं, तो आप grep को छोड़ सकते हैं। इसके बाद के संस्करण के लिए,

awk '/^password/ {print $2}' 

awk आसानी से कट, पूंछ, शौचालय, टीआर आदि और especally कई greps एक दूसरे के बगल पहुंचाया तरह किसी भी पाठ आदेश जगह ले सकता है। i.e

grep some_co.mand | a | grep b ... to | awk '/a|b|and so on/ {some action}.