我知道ifconfig命令可以列出网络接口信息。 但我希望以下列模式获取信息
Interface_Name IP_Address Net_Mask Status(up/down)
例如
eth0 192.168.1.1 255.255.255.0 down
我尝试了ifconfig和grep命令,但无法获得正确的模式。 还有另外一个命令或一些技巧吗?
答案 0 :(得分:4)
Python很好:D但是请参阅bash:
Interfaces=`ifconfig -a \
| grep -o -e "[a-z][a-z]*[0-9]*[ ]*Link" \
| perl -pe "s|^([a-z]*[0-9]*)[ ]*Link|\1|"`
for Interface in $Interfaces; do
INET=`ifconfig $Interface | grep -o -e "inet addr:[^ ]*" | grep -o -e "[^:]*$"`
MASK=`ifconfig $Interface | grep -o -e "Mask:[^ ]*" | grep -o -e "[^:]*$"`
STATUS="up"
if [ "$INET" == "" ]; then
INET="-"
MASK="-"
STATUS="down";
fi
printf "%-10s %-15s %-16s %-4s\n" "$Interface" "$INET" "$MASK" "$STATUS"
done
这很简单。
这是基于“ifconfig interface
未显示互联网地址”的假设来表示界面已关闭。
我希望这会有所帮助。
答案 1 :(得分:3)
ifconfig
有两种输出模式 - 默认输出模式,输出模式输出更多,短输出模式-s
输出模式更少(或者更确切地说,选择不同的信息位)从你想要的)。那么如何在默认模式下使用ifconfig并在脚本中挑选你想要的特定信息(python,perl,ruby,awk,bash + sed + ......,无论什么漂浮在你的船上;-)。例如,w / Python:
import re
import subprocess
ifc = subprocess.Popen('ifconfig', stdout=subprocess.PIPE)
res = []
for x in ifc.stdout:
if not x.strip():
print ' '.join(res)
del res[:]
elif not res:
res.append(re.match(r'\w+', x).group())
else:
mo = re.match(r'\s+inet addr:(\S+).*Mask:(\S+)', x)
if mo:
res.extend(mo.groups())
elif re.match(r'\sUP\s', x):
res.append('up')
elif re.match(r'\sDOWN\s', x):
res.append('down')
if res: print ' '.join(res)
并且输出应该按照您的意愿(我希望在我提到的任何其他语言中轻松翻译)。
答案 2 :(得分:0)
您可能对ip
命令感兴趣。以下示例重点介绍以CIDR表示法输出它们的全局有效IPv4地址。
# list interfaces that are up
ip -family inet -oneline addr show scope global | awk '{ printf "%s %s up\n", $2, $4 }'
# list interfaces that are down
ip -family inet -oneline link show scope global | grep ' DOWN ' | sed 's/\://g' | awk '{ printf "%s none down\n", $2}'
(请注意,示例中省略了所需的网络掩码表示。)
由于ip
非常强大,您可以使用其他参数找到更清晰的解决方案。