我有这个命令行,但它是grep
and 的两倍awk
ifconfig eth1 2> /dev/null | grep "inet " | awk '{gsub("addr:","",$2); print $2 }' ||
ifconfig eth0 2> /dev/null | grep "inet " | awk '{gsub("addr:","",$2); print $2 }'`
我一直在尝试通过做类似的事情来缩短这个时间,
echo $(ifconfig eth1 2> /dev/null || ifconfig eth0 2> /dev/null) &> grep "inet " |
awk '{gsub("addr:","",$2); print $2 }'
但当我想要获取服务器的IP时,它什么也没有返回。如果出现错误,获取信息的最佳方式是什么,请尝试此操作,然后将其传送到grep
答案1
另一种更加模块化的方法:不是 bash 特定的
get_ifconfig () {
for iface do
ifconfig "$iface" 2>/dev/null && return
done
}
get_ifconfig eth1 eth2 eth3 | sed -n 's/.*inet addr:\([0-9.]\+\).*/\1/p'
答案2
尝试这个:
$ ( ifconfig eth2 2>/dev/null || ifconfig eth0 2>/dev/null ) | grep ...
它具有相同的逻辑,但它在||
括号内执行,因此它仅将成功命令的输出传递给grep
.
答案3
这个方法怎么样
$ echo eth1 eth0 | xargs -n 1 ifconfig 2>/dev/null | awk '/inet/{gsub("addr:","",$2);print $2;exit}'
192.168.124.132
$
答案4
如果要获取第一个具有 IPv4 地址的接口,ifconfig
只需运行一次即可显示所有接口并提取第一个具有 IPv4 地址的条目。您还可以通过将您正在执行的操作与grep
和相结合来优化提取awk
。
ifconfig -a | awk '/^[^ ]/ {iface=$1}
iface ~ /^eth/ && sub(/inet addr:/,"") {print $1; exit}'
换行符是可选的,为了清楚起见,我将其包括在内。这是一个更详细的版本
ifconfig -a | awk 'sub(/inet addr:/,"") {print $1; exit}'
127.0.0.1
这可能会打印出您可能不想要的类似内容(来自环回接口)。
如果您更喜欢使用ip
,那么解析同样很尴尬。
ip addr | awk '/^[0-9]/ {iface=$2}
iface ~ /^eth/ && $1 == "inet" {sub(/\/.*/, "", $2); print $2}'