Разделите строку на несколько переменных в 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
Ответы
Ответ 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 любой литеральный текст может быть процитирован (должен быть, если есть пробел), но метамарки регулярных выражений не должны быть указаны.