Question

I have a string that gets generated below:

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

How can I take that string and make 2 variables out of it (using bash)?

For example I want

$ip=192.168.1.1 
$int=GigabitEthernet1/0/13
Was it helpful?

Solution

Try this:

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]}"

In this script ${myarray[0]} refers to the first field in the comma-separated string, ${myarray[1]} refers to the second field in the comma-separated string, etc.

OTHER TIPS

Use read with a custom field separator (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

Make sure to enclose the string in quotes.

@damienfrancois has the best answer. You can also use bash regex matching:

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

With bash regexes, any literal text can be quoted (must be, if there's whitespace), but the regex metachars must not be quoted.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top