нужно разбить IP-адрес, хранящийся в переменной bash, на октеты - PullRequest
5 голосов
/ 19 октября 2011

У меня есть переменная bash, которая содержит IP-адрес (без CIDR или чего-либо еще, только четыре октета).

Мне нужно разбить эту переменную на четыре отдельных октета, например:

$ip = 1.2.3.4; 
$ip1 = 1
$ip2 = 2
# etc

так что я могу избежать периода в сед.Есть лучший способ сделать это?это то, что я ищу?

Ответы [ 5 ]

11 голосов
/ 19 октября 2011

Вы можете использовать Bash.Вот одна строка, которая предполагает, что ваш адрес указан в $ip:

IFS=. read ip1 ip2 ip3 ip4 <<< "$ip"

. Он работает, устанавливая «внутренний разделитель полей» только для одной команды, изменяя его с обычного разделителя пробелов на точку,Команда read выполнит его.

5 голосов
/ 19 октября 2011

Если вы хотите назначить каждый октет своей собственной переменной без использования массива или отдельной переменной с переносами новой строки (чтобы вы могли легко запустить ее через цикл for), вы можете использовать модификаторы # и % для ${x} вроде так:

[ 20:08 jon@MacBookPro ~ ]$ x=192.160.1.1 && echo $x
192.160.1.1
[ 20:08 jon@MacBookPro ~ ]$ oc1=${x%%.*} && echo $o1
192
[ 20:08 jon@MacBookPro ~ ]$ x=${x#*.*} && echo $x
160.1.1
[ 20:08 jon@MacBookPro ~ ]$ oc2={x%%.*} && echo $o2
160
[ 20:08 jon@MacBookPro ~ ]$ x=${x#*.*} && echo $x
1.1
[ 20:08 jon@MacBookPro ~ ]$ oc3=${x%%.*} && echo $o3
1
[ 20:08 jon@MacBookPro ~ ]$ x=${x#*.*} && echo $x
1
[ 20:08 jon@MacBookPro ~ ]$ oc4=${x%%.*} && echo $oc4
1

[ 20:09 jon@MacBookPro ~ ]$ echo "$oc1\.$oc2\.$oc3\.$oc4"
192\.160\.1\.1

См. / wiki / Bash: _Append_to_array_using_ while-loop
и больше в этой статье .

2 голосов
/ 19 октября 2011

Вы можете разделить строки, используя встроенный set, с IFS в качестве разделителя (обычно пробел и табуляция).

splitip () {
    local IFS
    IFS=.
    set -- $*
    echo "$@"
}

splitip 12.34.56.78
# Now $1 contains 12, $2 contains 34, etc

Если вам просто нужно убрать точки с обратной косой черты, используйте подстановку строк - bash имеет ${ip//./\\.}

1 голос
/ 28 октября 2014

Этот код я нашел на другом сайте, когда пытался сделать то же самое. Отлично работает для моего приложения.

   read ICINGAIPADDRESS
# The following lines will break the ICINGAIPADDRESS variable into the four octets 
# and assign each octet to a variable.

ipoct1=$(echo ${ICINGAIPADDRESS} | tr "." " " | awk '{ print $1 }')
ipoct2=$(echo ${ICINGAIPADDRESS} | tr "." " " | awk '{ print $2 }')
ipoct3=$(echo ${ICINGAIPADDRESS} | tr "." " " | awk '{ print $3 }')
ipoct4=$(echo ${ICINGAIPADDRESS} | tr "." " " | awk '{ print $4 }')
0 голосов
/ 13 июня 2019

Более простой способ - использовать AWK:

echo 192.168.0.12 | awk -F. '{print $1 $2 $3 $4}'

-F - разделитель полей, в этом случае мы используем точку "." в качестве разделителя и печатать каждый столбец отдельно.

mortiz@florida:~/Documents/projects$ echo 76.220.156.100 | awk -F. '{print $1 $2 $3 $4}'
76220156100
mortiz@florida:~/Documents/projects$ echo 76.220.156.100 | awk -F. '{print $1}'
76
mortiz@florida:~/Documents/projects$ echo 76.220.156.100 | awk -F. '{print $2}'
220
mortiz@florida:~/Documents/projects$ echo 76.220.156.100 | awk -F. '{print $3}'
156
mortiz@florida:~/Documents/projects$ echo 76.220.156.100 | awk -F. '{print $4}'
100
...