Experimente:
ifconfig -a | sed 's/[ \t].*//;/^$/d'
Isso omitirá lo
:
ifconfig -a | sed 's/[ \t].*//;/^\(lo\|\)$/d'
Eu quero obter uma lista de todos os nomes de dispositivos de rede disponíveis no meu servidor Linux. Eu percebi que
ifconfig
faria o trabalho, no entanto ifconfig produz bastante saída:
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
[...]
O que eu quero alcançar é uma lista como
eth0
eth1
eth2
lo
ou melhor ainda
eth0
eth1
eth2
Suponho que isso pode ser feito por uma combinação de "cat", "sed" e "grep", mas simplesmente não tenho idéia de como remover as informações desnecessárias.
Outra alternativa seria:
ip -o link show | awk -F': ' '{print $2}'
Ou talvez:
ls /sys/class/net
Basta usar / sys / class / net e remover o caminho:
$ basename -a /sys/class/net/*
eth0
eth1
lo
ppp0
tun0
Tente isto:
ifconfig | cut -c 1-8 | sort | uniq -u
cut -c 1-8
extrai os primeiros 8 caracteres de cada linha sort
classifica as linhas uniq -u
imprime somente linhas exclusivas que removerão as linhas em branco das linhas de descrição que possuem apenas espaços em seus primeiros oito caracteres Isso funciona em duas máquinas linux que eu tentei, mas no meu MacBookPro (OS X 10.6.4), ifconfig
usa guias em vez de espaços, então é um pouco mais complicado:
ifconfig | expand | cut -c1-8 | sort | uniq -u | awk -F: '{print $1;}'
expand
converte guias em espaços awk -F: '{print $1;}'
imprime o primeiro campo antes de dois pontos. Usando /sys
filesystem:
basename -a $(ls /sys/devices/**/net/* -d)
Usando ip e Perl:
ip -o l|perl -lane'$F[1]=~s/://g;print $F[1]'
ls /sys/class/net/
eth0 eth1 eth2 lo
ou se você precisar apenas de eth *
ls /sys/class/net/ | grep ^eth
eth0
eth1
eth2
Aqui está uma maneira de extrair os nomes das interfaces da ifconfig
output:
ifconfig -a | sed -n 's/^\([^ ]\+\).*//p'
Se você quiser excluir determinados nomes, uma maneira é filtrar ainda mais com grep
:
ifconfig -a | sed -n 's/^\([^ ]\+\).*//p' | grep -Fvx -e lo
Se você quiser excluir mais nomes, adicione mais -e foo
ao comando grep
.
para imprimir apenas a primeira coluna:
netstat -a | awk '{print $1}'
você pode incorporar outras regras no awk para adicionar ou remover entradas, conforme necessário.
EDIT: o mesmo acontece com o ifconfig (como o Doug apontou)
ifconfig | awk '{print $1}'
Este é um exemplo excluindo a interface 'lo'
ifconfig | awk '{if ($1 != lo) print $1}'
/usr/sbin/ip addr show | awk '/^[1-9]/ {print $2}'
fornece
lo:
eth0:
eth1:
eth2:
como saída
Mesmo que exista uma solução aceita, gostaria de apresentar minha solução para isso.
Eu tenho um monte de interfaces virtuais e gostaria de obter uma lista, utilizável em vários scripts 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
Não estou interessado em loopback, pois sei que está lá:)
Este one-liner faz o trabalho:
ifconfig | egrep '^eth' | cut -f 1-2 -d ':' | cut -f 1 -d ' '| pcregrep -o1 "(((eth\d)(:\d))|(eth\d))"
Produz uma saída como:
eth0
eth0:1
eth0:2
eth0:3
Aproveite.
Toda a solução acima funciona bem. Ainda assim você pode tentar isso
ifconfig | grep HW | cut -c 1-6
Como lo
, que é loopback, não tem um endereço HW, ele não será exibido.
Saída -
root@glum:/home/amit# ifconfig | grep HW | cut -c 1-6 enp7s0 vmnet1 vmnet8 wlp6s0
A solução mais fácil está no homem ifconfig (8)
man ifconfig (8) extrai o link :
The -l flag may be used to list all available interfaces on the system, with no other additional information. Use of this flag is mutually exclusive with all other flags and commands, except for -d (only list interfaces that are down) and -u (only list interfaces that are up).
Então, para ter a lista, use:
ifconfig -l
Os nomes serão separados por um espaço, então você tem que usar sed para substituir esses espaços por um \ n:
ifconfig -l | sed 's/ /
/g'
Nenhuma das soluções acima funcionou para mim, eis a minha solução:
ifconfig -a | egrep "^[a-z]+" | sed "s/: .*//" | grep -v "lo"
lo
interface Saídas:
eth0
eth0:1
wlan0
ifconfig | grep flags | awk -F: '{print $1;}'
Tags networking grep cat sed linux