仅列出所有可用网络接口的设备名称


21

我想获取我的Linux服务器上所有可用的网络设备名称的列表。我认为

ifconfig

可以完成这项工作,但是ifconfig会产生很多输出:

eth0      Link encap:Ethernet  Hardware Adresse 08:00:27:fc:5c:98  
          inet Adresse:192.168.2.222  Bcast:192.168.2.255  Maske:255.255.255.0
          inet6-Adresse: fe80::a00:27ff:fefc:5c98/64 Gültigkeitsbereich:Verbindung
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metrik:1
          RX packets:329 errors:0 dropped:0 overruns:0 frame:0
          TX packets:177 errors:0 dropped:0 overruns:0 carrier:0
          Kollisionen:0 Sendewarteschlangenlänge:1000 
          RX bytes:41496 (40.5 KiB)  TX bytes:32503 (31.7 KiB)

eth1      Link encap:Ethernet  Hardware Adresse 08:00:27:e9:35:7d  
          [...]

eth2      Link encap:Ethernet  Hardware Adresse 08:00:27:ff:db:fe  
          [...]

lo        Link encap:Lokale Schleife  
          [...]

我想要实现的是一个类似的列表

eth0
eth1
eth2
lo

甚至更好

eth0
eth1
eth2

我认为可以通过组合使用“ cat”,“ sed”和“ grep”来完成,但是我根本不知道如何剥离不必要的信息。

Answers:


17

试试看:

ifconfig -a | sed 's/[ \t].*//;/^$/d'

这将省略lo

ifconfig -a | sed 's/[ \t].*//;/^\(lo\|\)$/d'

谢谢丹尼斯,这就像一个魅力^^。Perfekt。正则表达式确实是我应该研究的东西^^
ftiaronsem

我意识到Linux和BSD通常包含不同的*nix实用程序,但不幸的是,该解决方案在Mac上不起作用:(
blong

ifconfig很遗憾,请ip改用
pstanton '18

这似乎适用于OS X:ifconfig -a | sed -E 's/[[:space:]:].*//;/^$/d'
已暂停,直到另行通知。

22

另一种选择是:

ip -o link show | awk -F': ' '{print $2}'

或许:

ls /sys/class/net

ls /sys/class/net在以下/etc/local.d脚本中使用更好的解决方案openrc- sed上面的解决方案:在从其运行时/etc/init.d/local(但不是在直接运行脚本时)在每个接口的末尾都有一个额外的结尾。
Stuart Cardall '16

+1表示-o-不知道
Patryk

16

只需使用/ sys / class / net并删除路径:

$ basename -a /sys/class/net/*
eth0
eth1
lo
ppp0
tun0

6

尝试这个:

ifconfig | cut -c 1-8 | sort | uniq -u
  • cut -c 1-8 提取每行的前8个字符
  • sort 整理线条
  • uniq -u 仅打印唯一的行,这将删除描述行的空白行,该描述行的前八个字符中只有空格

这在我尝试过的两台Linux机器上都可以使用,但是在我的MacBookPro(OS X 10.6.4)上,ifconfig它使用制表符而不是空格,因此有点复杂:

ifconfig | expand | cut -c1-8 | sort | uniq -u | awk -F: '{print $1;}'
  • expand 将制表符转换为空格
  • awk -F: '{print $1;}' 在冒号之前打印第一个字段。

非常感谢您,特别是对于解释所用参数的非常详细的答案。如果将来我会遇到类似的问题,我知道该看哪篇文章了;-)。不幸的是,它并没有减少“ lo”,因此可以接受的答案是dennis。但这确实是一个非常有用的答案,谢谢:-)
ftiaronsem 2010年

添加| grep -v lo:-)
道格·哈里斯

4
ls /sys/class/net/
eth0  eth1  eth2  lo

或者如果您只需要eth *

ls /sys/class/net/eth*
eth0
eth1
eth2

3

使用/sys文件系统:

basename -a $(ls /sys/devices/**/net/* -d)

使用ip和Perl:

ip -o l|perl -lane'$F[1]=~s/://g;print $F[1]'

1

这是从ifconfig输出中提取接口名称的一种方法:

ifconfig -a | sed -n 's/^\([^ ]\+\).*/\1/p'

如果要排除某些名称,一种方法是进一步过滤grep

ifconfig -a | sed -n 's/^\([^ ]\+\).*/\1/p' | grep -Fvx -e lo

如果要排除更多名称,请-e foogrep命令中添加更多名称。


您的解决方案与Dennis的解决方案一样好。不幸的是,我不能接受两个职位,所以丹尼斯简直更快。但是,尽管如此,尤其感谢您对grep的解释。
ftiaronsem

1

只打印第一列:

netstat -a | awk '{print $1}'

您可以在awk中合并其他规则以根据需要添加或删除条目。

编辑:ifconfig也一样(如Doug指出)

ifconfig | awk '{print $1}'

这是一个排除“ lo”界面的示例

ifconfig | awk '{if ($1 != lo) print $1}'

那行不通。awk将忽略前导空格,并在随后的每一行中打印第一个单词。
道格·哈里斯

不幸的是,这确实是行不通的,却遭受了道格指出的确切问题。但是,感谢您的帮助,不过,我非常感谢您帮助像我这样的新人。
ftiaronsem

1
/usr/sbin/ip addr show | awk '/^[1-9]/ {print $2}'

提供

lo:
eth0:
eth1:
eth2:

作为输出


1

即使存在公认的解决方案,我也想提出我的解决方案。

我有一堆虚拟接口,并且想要获得一个列表,可以在各种bash脚本中使用。

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 11.22.33.137  netmask 255.255.255.192  broadcast 11.22.33.191
        inet6 fe80::a00:27ff:fe8c:6bd3  prefixlen 64  scopeid 0x20<link>
        ether 08:00:27:8c:6b:d3  txqueuelen 1000  (Ethernet)
        RX packets 2969136  bytes 2394432908 (2.2 GiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 1378821  bytes 358960701 (342.3 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

eth0:1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 11.22.33.189  netmask 255.255.255.192  broadcast 11.22.33.191
        ether 08:00:27:8c:6b:d3  txqueuelen 1000  (Ethernet)

eth0:2: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 11.22.33.190  netmask 255.255.255.192  broadcast 11.22.33.191
        ether 08:00:27:8c:6b:d3  txqueuelen 1000  (Ethernet)

eth0:3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 11.22.33.180  netmask 255.255.255.192  broadcast 11.22.33.191
        ether 08:00:27:8c:6b:d3  txqueuelen 1000  (Ethernet)

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1  (Local Loopback)
        RX packets 673768  bytes 277972236 (265.0 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 673768  bytes 277972236 (265.0 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

我对回送不感兴趣,因为我知道它存在:)

这个单线完成工作:

ifconfig | egrep '^eth' | cut -f 1-2 -d ':' | cut -f 1 -d ' '| pcregrep -o1 "(((eth\d)(:\d))|(eth\d))"

产生如下输出:

eth0
eth0:1
eth0:2
eth0:3

请享用。


1

上述所有解决方案都可以正常工作。仍然可以尝试一下

ifconfig | grep HW | cut -c 1-6

由于lo没有为回送分配硬件地址,因此不会显示。

输出-

root @ glum:/ home / amit#ifconfig | grep HW | 切-c 1-6
enp7s0
vmnet1
vmnet8
wlp6s0

1

最简单的解决方案是在man ifconfig(8)中

man ifconfig(8)提取http://www.manpagez.com/man/8/ifconfig/

-l标志可用于列出系统上所有可用的接口,而没有其他附加信息。此标志的使用与所有其他标志和命令互斥,除了-d(仅关闭的列表接口)和-u(仅打开的列表接口)。

因此,要获得列表,请使用:

ifconfig -l

名称将用空格分隔,因此您必须使用sed将这些空格替换为\ n:

ifconfig -l | sed 's/ / /g'


1

改进的:

netstat -i | grep '^[a-z]' | awk '{print $1}' | grep -v 'lo'

1
您可能应该做到这一点grep -v '^lo$';您当前的命令将排除(假设的示例)logicalridiculous接口。
斯科特

0

以上解决方案均不适用于我,这是我的解决方案:

ifconfig -a  | egrep "^[a-z]+" | sed "s/: .*//" | grep -v "lo"
  1. 列出所有可用的接口
  2. 仅提取包含设备名称的行(开头没有空格)
  3. 从第一个空格中删除不相关的尾部
  4. 排除lo介面

输出:

eth0
eth0:1
wlan0

0

“ ifcongif -l”应该可以完成这项工作。其输出类似于“ lo0 gif0 stf0 en0 ...”,没有换行符。

我在某个网站上找到了它,但现在找不到了。而且我还在寻找那个“ -l”标志的含义。


0

有时默认情况下未安装nettools。因此,我喜欢使用内置命令,这些命令可以在/ bin,/ usr / bin和/ usr / sbin中提供更多的保证,而不必担心后安装的软件包。

ip addr:显示/操纵路由,设备,策略路由和隧道(地址)
grep:找到一个空格,然后在unitl之后输入任何内容:
cut:使用(:)作为分隔符并获取字段2
tr:删除任何空格

$ ip地址| grep -E':\ s。* ?:'| 切-d“:” -f 2 | tr -d“”

0

在macOS上进行了测试,以下工作正常。我需要查找所有已启动的接口。这是基于上面Dennis Williamson的答案。

ifconfig -a | grep UP | sed 's/:.*//;/^$/d'


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.