使用 or 和管道优化命令来解析 ifconfig 的输出

使用 or 和管道优化命令来解析 ifconfig 的输出

我有这个命令行,但它是grepand 的两倍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}'

相关内容