我正在开发一个bash脚本,我正试图从一个打开的网络接口获取一个IPv4地址,在这个操作中我正在使用 ip addr 和 sed < / strong>,但出了点问题,因为我无法从 sed 获得IP。
所以,脚本在某些时候有这个:
ip addr show dev eth0 | grep "inet "
这应该归还:
inet 192.168.1.3/24 brd 192.168.1.255 scope global eth0
使用 sed ,我想要这个:
192.168.1.3/24
我尝试过一些正则表达式,但它只会出错或空行!我怎样才能做到这一点?
答案 0 :(得分:2)
试试这个
ip addr show dev eth0 | sed -nr 's/.*inet ([^ ]+).*/\1/p'
编辑:根据要求提供解释性词语。
-n in sed suppressed automatic printing of input line
-r turns on extended regular expressions
s/.*inet ([^ ]+).*/\1/p
搜索后跟inet和空格的任何内容,记住那些空间后面没有空格的所有[括号],后面跟任何东西,并用记住的东西[\ 1](IP地址)替换所有内容,然后打印该行(p)。
答案 1 :(得分:1)
我知道你要求sed,所以这里有一个使用GNU sed版本4.2.1的答案。它非常具体,而且非常适合您的需求。根据您的ip addr show
命令,我认为这是一个Linux。
ip addr show dev eth0 \
| sed -n '/^\s\+inet\s\+/s/^\s\+inet\s\+\(.*\)\s\+brd\s.*$/\1/p'`
使用awk更简单的方法:
ip addr show dev eth0 | awk '$1=="inet" {print $2}'
答案 2 :(得分:0)
您可以使用以下内容:
sed -e 's/^[^ ]* //' -e 's/ .*//'
答案 3 :(得分:0)
使用grep直接找到答案。
ip addr show dev eth0 | grep -P '\d+\.\d+\.\d+.\d+\/\d+' -o
答案 4 :(得分:0)
嗯,sed和awk的答案都很好。为了只获得没有子网掩码的IP,你可以继续这样做:
ip addr show dev eth0 | sed -nr 's/.*inet ([^ ]+).*/\1/p' **| cut -f1 -d'/'**
或
ip addr show dev eth0 | awk '$1=="inet" {print $2}' **| cut -f1 -d'/'**
或
更好:
ip route get 255.255.255.255 | grep -Po '(?<=src )(\d{1,3}.){4}'
这应该只输出IP地址。