2009-11-18 4 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

см. Мое редактирование. одним из способов является установка IFS. – ghostdog74

+1

Спасибо. Выучили несколько новых трюков сегодня! – calvinkrishy

7

Это один работает:

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

EDIT: (улучшенный, вкладываемый версию согласно Деннису)

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

Если вы измените обратные ссылки на '$()', я подниму вас. –

+0

Это не работает. BTW, не такое же выражение, какое я использую? Есть ли разница между использованием $() и '(backticks)? – calvinkrishy

+2

Это работает для меня. Это выглядит так: '$()': 'n = ($ (grep -i ipaddress имя_файла | 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 

Если файл не имеет другого содержимого, вам может не понадобиться grep, и вы можете прочитать весь файл.

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

раствор А Perl:

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

который проверяет и удаляет нежелательные символы в одной операции.

0

Вы можете сделать это, используя IFS в bash.

  • Сначала прочитайте первую строку из файла.
  • Seoncd преобразует это в массив с = в качестве делиметра.
  • Третий конвертировать значение в массив с ; в качестве делиметра.

Thats it !!!

#!/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]} 
Смежные вопросы