Bash

Bash:提取 IPv4 地址的四個部分之一

  • April 3, 2020

我們可以使用語法${var##pattern}${var%%pattern}提取 IPv4 地址的最後和第一部分:

IP=109.96.77.15
echo IP: $IP
echo 'Extract the first section using ${var%%pattern}: ' ${IP%%.*}
echo 'Extract the last section using ${var##pattern}: ' ${IP##*.}

我們如何使用參數擴展提取 IPv4 地址的第二或第三部分?

這是我的解決方案:我使用數組並更改 IFS 變數。

:~/bin$ IP=109.96.77.15
:~/bin$ IFS=. read -a ArrIP<<<"$IP"
:~/bin$ echo ${ArrIP[1]}
   96
:~/bin$ printf "%s\n" "${ArrIP[@]}"
   109
   96
   77
   15

此外,我還使用 、 和 命令編寫了一些awk解決sed方案cut

現在,我的問題是:是否有基於不使用數組和 IFS 更改的參數擴展的更簡單的解決方案?

假設 IFS 的預設值,您將每個八位字節提取到它自己的變數中:

read A B C D <<<"${IP//./ }"

或者進入一個數組:

A=(${IP//./ })

我確實意識到您專門要求了一個沒有暫時重新定義的解決方案IFS,但是我有一個您沒有涵蓋的甜蜜而簡單的解決方案,所以這裡是:

IFS=. ; set -- $IP

這個簡短的命令會將你的 IP 地址的元素放在 shell 的位置參數 $1, $2, $3, 中$4。但是,您可能希望先保存原始IFS文件,然後再恢復。

誰知道?也許您會因其簡潔和高效而重新考慮並接受此答案。

(這以前被錯誤地給出為IFS=. set -- $IP

引用自:https://unix.stackexchange.com/questions/420328