Перенаправить вывод в массив bash - PullRequest
19 голосов
/ 18 ноября 2009

У меня есть файл, содержащий строку

ipAddress=10.78.90.137;10.78.90.149

Я бы хотел поместить эти два IP-адреса в массив bash. Чтобы добиться этого, я попробовал следующее:

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

Это приводит к извлечению значений в порядке, но по какой-то причине размер массива возвращается как 1, и я заметил, что оба значения определены как первый элемент в массиве. Это

echo ${n[0]}

возвращает

10.78.90.137 10.78.90.149

Как мне это исправить?

Спасибо за помощь!

Ответы [ 5 ]

20 голосов
/ 18 ноября 2009

тебе действительно нужен массив

Баш

$ 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 $@ #this is "array"

если вы хотите поместить в массив

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

@ OP, относительно вашего метода: установите для IFS пробел

$ 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 или просто оболочку bash

#!/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
7 голосов
/ 18 ноября 2009

Это работает:

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

РЕДАКТИРОВАТЬ: (улучшенная, нестабильная версия согласно Деннису)

n=($(grep -i ipaddress filename | cut -d"=" -f2 | tr ';' ' '))
1 голос
/ 19 ноября 2009

Решение Perl:

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

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

1 голос
/ 18 ноября 2009

Вариация на тему:

$ 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"
0 голосов
/ 26 января 2018

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

  • Сначала прочитайте первую строку из файла.
  • 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]}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...