我正在开发一个bash脚本,我试图从一个networking接口打开一个IPv4地址,在这个操作我使用IP地址和sed ,但有些是错误的,因为我无法从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
我已经尝试了一些正则expression式,但它只给出错误或空行! 我怎样才能做到这一点?
尝试这个
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)。
我知道你问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}'
你可以使用这样的东西:
sed -e 's/^[^ ]* //' -e 's/ .*//'
使用grep直接找出你的答案。
ip addr show dev eth0 | grep -P '\d+\.\d+\.\d+.\d+\/\d+' -o
那么,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地址。