ifconfig | grep -m1 "inet addr"
给我
inet addr:172.30.1.6 Bcast:172.30.140.255 Mask:255.255.252.0
但是,我只想要ip,这是172.30.1.6
。我该怎么做? 请注意,我必须使用 ifconfig,因为这是一个功能有限的嵌入式系统。
拿出你的剪刀,是时候剪了。
echo inet addr:172.30.1.6 Bcast:172.30.140.255 Mask:255.255.252.0 | cut -d : -f 2 | cut -d " " -f 1
一种方法可以做到这一点..
ifconfig | grep -m1 "inet addr" | awk '{print $2}' | awk -F: '{print $2}'
如果您只想获取 IP 地址,则可能有更简单的方法可以使用主机名-i来实现它(参考哪个终端命令只获取 IP 地址而没有其他内容?
由于其他人已经提到了剪切和awk,我将使用sed提供解决方案:
echo "inet addr:172.30.1.6bcast:172.30.140.255 掩码:255.255.252.0" | sed -e "s/.*\(addr:[^ ]*\) .*/\1/" 地址:172.30.1.6 回显 "内特地址:172.30.1.6 广播:172.30.140.255 掩码:255.255.252.0" |sed -e "s/.*addr:\([^ ]*\) .*/\1/" 172.30.1.6
使用带有分隔符的剪切
| cut -d':' -f 2 | cut -d' ' -f 1
这就是你想做的全部吗?
awk -F'[: ]' '/inet addr/{print $3; exit}'
例如,使用cat file
代替ifconfig
:
$ cat file
inet addr:172.30.1.6 Bcast:172.30.140.255 Mask:255.255.252.0
$ cat file | awk -F'[: ]' '/inet addr/{print $3; exit}'
172.30.1.6
这是一种使用单个sed
命令执行此操作的方法,消除了对grep
的调用:
ifconfig | sed -n '/inet addr/{s/^.*inet addr:([^ ]*).*$/1/p;q}'
这里有一些事情发生:
sed -n
告诉sed
不要像往常一样打印每一行/inet addr/
是一个sed
地址 - 它告诉sed
只在包含"inet addr"
的线路上运行{
和}
括号定义要运行的命令块,命令之间用;
s
命令相当简单 - 它只是捕获 IP 并仅用 IP 替换整行s
命令末尾的p
标志告诉sed
打印替换结果。这是必要的,因为我们使用-n
选项调用sed
。q
命令告诉sed
退出,以便它只处理包含"inet addr"
的第一行。
使用-n
选项,/inet addr/
地址、s
命令上的p
标志和q
命令基本上具有与grep -m1 "inet addr"
相同的效果,这使得调用grep
变得没有必要。实际上,值得注意的是,以下命令生成相同的输出:
> ifconfig | grep -m1 "inet addr"
inet addr:192.168.1.1 Bcast:192.168.2.255 Mask:255.255.255.0
> ifconfig | sed -n '/inet addr/{p;q}'
inet addr:192.168.1.1 Bcast:192.168.2.255 Mask:255.255.255.0
在这里,我省略了sed
命令的s/pattern/replacement/p
部分,并将其替换为p
命令(仅打印整行),只是为了单独显示其他部分的效果。
只需使用命令cut。
ip a | grep -m1 "inet addr" | cut -d':' -f 2 | cut -d' ' -f 1
我还建议您学习使用其他命令,例如:wc,sed,tr,sort,uniq。他们将帮助随心所欲地操纵输出。这是一个小课程,我们向您展示所有这些命令: https://www.javatpoint.com/linux-filters
我希望对您有所帮助。
使用 Bash 的正则表达式运算符=~
:
$ [[ $(ifconfig | grep -m1 "inet addr") =~ [0-9]+.[0-9]+.[0-9]+.[0-9]+ ]] && echo ${BASH_REMATCH[0]}
172.30.1.6
更新:评论中的内容更好。