我有一个在下面生成的字符串:
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
答案 0 :(得分:47)
试试这个:
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]}"
在此脚本中${myarray[0]}
引用逗号分隔字符串中的第一个字段,${myarray[1]}
引用逗号中的第二个字段 - 分隔字符串等
答案 1 :(得分:24)
将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
确保将字符串括在引号中。
答案 2 :(得分:7)
@damienfrancois有最好的答案。您还可以使用bash正则表达式匹配:
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正则表达式,可以引用任何文字文本(必须是,如果有空格),但不得引用正则表达式字符。