Подтвердить что ты не робот

Разделите строку на несколько переменных в Bash

У меня есть строка, которая создается ниже:

192.168.1.1,UPDOWN,Line protocol on Interface GigabitEthernet1/0/13, changed state to up

Как я могу взять эту строку и сделать из нее 2 переменные (используя bash)?

Например, я хочу

$ip=192.168.1.1 
$int=GigabitEthernet1/0/13
4b9b3361

Ответ 1

Попробуйте следующее:

mystring="192.168.1.1,UPDOWN,Line protocol on Interface GigabitEthernet1/0/13, changed state to up"

IFS=',' read -a myarray <<< "$mystring"

echo "IP: ${myarray[0]}"
echo "STATUS: ${myarray[3]}"

В этом script ${myarray[0]} относится к полю first в строке, разделенной запятыми, ${myarray[1]} относится к полю second в разделенном запятой строка и т.д.

Ответ 2

Используйте read с помощью специального разделителя полей (IFS=,):

$ IFS=, read ip state int change <<< "192.168.1.1,UPDOWN,Line protocol on Interface GigabitEthernet1013, changed state to up"
$ echo $ip
192.168.1.1
$ echo ${int##*Interface}
GigabitEthernet1013

Убедитесь, что строка заключена в кавычки.

Ответ 3

@damienfrancois имеет лучший ответ. Вы также можете использовать соответствие bash regex:

if [[ $string =~ ([^,]+).*"Interface "([^,]+) ]]; then 
    ip=${BASH_REMATCH[1]}
    int=${BASH_REMATCH[2]}
fi
echo $ip; echo $int
192.168.1.1
GigabitEthernet1/0/13

С bash regexes любой литеральный текст может быть процитирован (должен быть, если есть пробел), но метамарки регулярных выражений не должны быть указаны.