2009-11-18 12 views
17

के उत्पादन पुन: निर्देशित मैं स्ट्रिंगएक बैश सरणी

ipAddress=10.78.90.137;10.78.90.149 

मैं एक पार्टी सरणी में इन दो IP पते देना चाहते वाली फ़ाइल है। प्राप्त करने के लिए कि मैं निम्नलिखित की कोशिश की:

n=$(grep -i ipaddress /opt/ipfile | cut -d'=' -f2 | tr ';' ' ') 

यह ठीक मान निकालने में लेकिन किसी कारण सरणी के आकार 1 के रूप में दिया जाता है के लिए परिणाम और मुझे लगता है कि दोनों मूल्यों में पहली तत्व के रूप में पहचाने जाते हैं नोटिस सरणी। यही कारण है कि

echo ${n[0]} 

रिटर्न

10.78.90.137 10.78.90.149 

है मैं इसे ठीक कैसे करूँ?

सहायता के लिए धन्यवाद!

उत्तर

18

तुम सच में एक सरणी की क्या ज़रूरत है

बैश

$ ipAddress="10.78.90.137;10.78.90.149" 
$ IFS=";" 
$ set -- $ipAddress 
$ echo $1 
10.78.90.137 
$ echo $2 
10.78.90.149 
$ unset IFS 
$ echo [email protected] #this is "array" 

यदि आप डब्ल्यू चींटी अपने विधि के संबंध में सरणी

$ a=([email protected]) 
$ echo ${a[0]} 
10.78.90.137 
$ echo ${a[1]} 
10.78.90.149 

@OP में लाना,: एक अंतरिक्ष

$ IFS=" " 
$ n=($(grep -i ipaddress file | cut -d'=' -f2 | tr ';' ' ' | sed 's/"//g')) 
$ echo ${n[1]} 
10.78.90.149 
$ echo ${n[0]} 
10.78.90.137 
$ unset IFS 

इसके अलावा करने के लिए अपने भारतीय विदेश सेवा निर्धारित करते हैं, तो कई उपकरणों का उपयोग करने की आवश्यकता नहीं है। तुम सिर्फ awk का उपयोग कर सकते हैं, या बस बैश शेल

#!/bin/bash 
declare -a arr 
while IFS="=" read -r caption addresses 
do 
case "$caption" in 
    ipAddress*) 
     addresses=${addresses//[\"]/} 
     arr=(${arr[@]} ${addresses//;/ }) 
esac 
done < "file" 
echo ${arr[@]} 

उत्पादन

$ more file 
foo 
bar 
ipAddress="10.78.91.138;10.78.90.150;10.77.1.101" 
foo1 
ipAddress="10.78.90.137;10.78.90.149" 
bar1 

$./shell.sh 
10.78.91.138 10.78.90.150 10.77.1.101 10.78.90.137 10.78.90.149 

घूर रहा

$ n=($(gawk -F"=" '/ipAddress/{gsub(/\"/,"",$2);gsub(/;/," ",$2) ;printf $2" "}' file)) 
$ echo ${n[@]} 
10.78.91.138 10.78.90.150 10.77.1.101 10.78.90.137 10.78.90.149 
+0

मानों को बाद में स्क्रिप्ट में उपयोग किया जाता है। अगर वे किसी सरणी में संग्रहीत होते हैं तो यह फिर से शुरू करना और उन पर अन्य परिचालन करना आसान बनाता है, इसलिए उन्हें एक सरणी में स्टोर करने की आवश्यकता होती है। आपके द्वारा वर्णित विधि में मेरी मदद करनी चाहिए। धन्यवाद! क्या आप कृपया अपने विचार साझा कर सकते हैं कि मैं जिस विधि का उपयोग कर रहा हूं वह असफल रहा है? – calvinkrishy

+0

मेरा संपादन देखें। एक तरीका आईएफएस सेट करना है। – ghostdog74

+1

धन्यवाद। आज कुछ नई चालें सीख लीं! – calvinkrishy

7

यह एक काम करता है:

n=(`grep -i ipaddress filename | cut -d"=" -f2 | tr ';' ' '`) 

संपादित करें: (डेनिस के अनुसार सुधार, nestable संस्करण)

n=($(grep -i ipaddress filename | cut -d"=" -f2 | tr ';' ' ')) 
+1

यदि आप अपनी बैकटीक्स को '$()' में बदलते हैं तो मैं आपको उखाड़ दूंगा। –

+0

यह काम नहीं करता है। बीटीडब्लू, अभिव्यक्ति नहीं है जैसा कि मैं उपयोग कर रहा हूं? क्या $() और '(बैकटीक्स) का उपयोग करने के बीच कोई अंतर है? – calvinkrishy

+2

यह मेरे लिए काम करता है। यह वही है जो यह '$()': 'n = ($ (grep -i ipaddress filename | cut -d" = "-f2 | tr ';' '' ') जैसा दिखता है) - बाहरी कोष्ठक इसे बनाते हैं एक सरणी में '$()' का उपयोग करना बेहतर है क्योंकि उन्हें घोंसला जा सकता है और उद्धरण प्राप्त करना और आसानी से भागना आसान है और वे अधिक पठनीय हैं: http://mywiki.wooledge.org/BashFAQ/082 –

1

एक बदलाव विषय पर:

$ line=$(grep -i ipaddress /opt/ipfile) 
$ saveIFS="$IFS" # always save it and put it back to be safe 
$ IFS="=;" 
$ n=($line) 
$ IFS="$saveIFS" 
$ echo ${n[0]} 
ipAddress 
$ echo ${n[1]} 
10.78.90.137 
$ echo ${n[2]} 
10.78.90.149 

फ़ाइल हैं कोई अन्य सामग्री नहीं है, आपकोकी आवश्यकता नहीं हो सकती हैऔर आप पूरी फाइल में पढ़ सकते हैं।

$ saveIFS="$IFS" 
$ IFS="=;" 
$ n=$(</opt/ipfile) 
$ IFS="$saveIFS" 
1

एक पर्ल समाधान:

n=($(perl -ne 's/ipAddress=(.*);/$1/&& print' filename)) 

जिसके लिए परीक्षण करता है और एक ऑपरेशन में अवांछित पात्रों को हटा।

0

आप IFSbash में उपयोग करके ऐसा कर सकते हैं।

  • सबसे पहले फ़ाइल से पहली पंक्ति पढ़ें।
  • Seoncd = के साथ एक सरणी में कनवर्ट के रूप में परिवर्तित करें।
  • तीसरा मान को ; के साथ डिलीमीटर के रूप में एक सरणी में परिवर्तित करें।

यह है !!!

#!/bin/bash 
IFS='\n' read -r lstr < "a.txt" 
IFS='=' read -r -a lstr_arr <<< $lstr 
IFS=';' read -r -a ip_arr <<< ${lstr_arr[1]} 
echo ${ip_arr[0]} 
echo ${ip_arr[1]}