Daftar hanya nama perangkat dari semua antarmuka jaringan yang tersedia

21

Saya ingin mendapatkan daftar semua Nama Perangkat Jaringan yang tersedia di server Linux saya. Saya pikir itu

ifconfig

akan melakukan pekerjaan itu, namun jika konfigurasi menghasilkan cukup banyak output:

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  
          [...]

Yang ingin saya capai adalah daftar seperti

eth0
eth1
eth2
lo

atau bahkan lebih baik

eth0
eth1
eth2

Saya berasumsi bahwa ini dapat dilakukan dengan kombinasi "kucing", "sed" dan "grep", tetapi saya sama sekali tidak tahu bagaimana cara menghapus informasi yang tidak diperlukan.

ftiaronsem
sumber

Jawaban:

17

Cobalah ini:

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

Ini akan menghilangkan lo:

ifconfig -a | sed 's/[ \t].*//;/^\(lo\|\)$/d'
Dijeda sampai pemberitahuan lebih lanjut.
sumber
Terima kasih dennis, ini bekerja seperti pesona ^^. Perfekt. Ekspresi Reguler benar-benar sesuatu yang harus saya perhatikan ^^
ftiaronsem
Saya menyadari bahwa Linux dan BSD sering mengandung *nixutilitas yang berbeda , tetapi sangat disayangkan solusi ini tidak berfungsi pada Mac :(
blong
ifconfigditolak, gunakan ipsebaliknya
pstanton
Ini sepertinya berfungsi untuk OS X:ifconfig -a | sed -E 's/[[:space:]:].*//;/^$/d'
Dijeda sampai pemberitahuan lebih lanjut.
22

Alternatif lain adalah:

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

Atau mungkin:

ls /sys/class/net
jweyrich
sumber
menggunakan ls /sys/class/netadalah solusi yang lebih baik dalam /etc/local.dskrip di openrc- sedsolusi di atas berakhir dengan tambahan :di akhir setiap antarmuka saat dijalankan dari /etc/init.d/local(tetapi tidak ketika skrip dijalankan secara langsung).
Stuart Cardall
+1 untuk -o- tidak tahu itu
Patryk
16

Cukup gunakan / sys / class / net dan hapus jalurnya:

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

Coba ini:

ifconfig | cut -c 1-8 | sort | uniq -u
  • cut -c 1-8 ekstrak 8 karakter pertama dari setiap baris
  • sort macam-macam garis
  • uniq -u hanya mencetak garis unik yang akan menghapus garis kosong untuk garis deskripsi yang hanya memiliki spasi dalam delapan karakter pertama mereka

Ini berfungsi pada dua mesin linux yang saya coba, tetapi pada MacBookPro saya (OS X 10.6.4), ifconfigmenggunakan tab bukan spasi, jadi ini sedikit lebih rumit:

ifconfig | expand | cut -c1-8 | sort | uniq -u | awk -F: '{print $1;}'
  • expand mengubah tab menjadi spasi
  • awk -F: '{print $1;}' mencetak bidang pertama sebelum titik dua.
Doug Harris
sumber
Terima kasih banyak, terutama untuk jawaban yang sangat rinci menjelaskan parameter yang digunakan. Jika saya akan memiliki masalah yang sama di masa depan, saya tahu di mana posting harus dilihat ;-). Sayangnya itu tidak memotong "lo", jadi jawaban yang diterima pergi ke dennis. Tapi ini benar-benar jawaban yang sangat berguna, terima kasih :-)
ftiaronsem
tambahkan | grep -v lo:-)
Doug Harris
4
ls /sys/class/net/
eth0  eth1  eth2  lo

atau jika Anda hanya membutuhkan et *

ls /sys/class/net/eth*
eth0
eth1
eth2
wWolfovich
sumber
3

Menggunakan /sysfilesystem:

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

Menggunakan ip dan Perl:

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

Inilah salah satu cara untuk mengekstrak nama antarmuka dari ifconfigoutput:

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

Jika Anda ingin mengecualikan nama tertentu, salah satu caranya adalah filter lebih lanjut dengan grep:

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

Jika Anda ingin mengecualikan lebih banyak nama, tambahkan lebih banyak -e fooke grepperintah.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
Solusi Anda berfungsi sama baiknya dengan dennis. Sayangnya saya tidak dapat menerima dua posting, jadi dennis hanya lebih cepat. Tetapi terima kasih, terutama untuk penjelasan Anda.
ftiaronsem
1

untuk hanya mencetak kolom pertama:

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

Anda dapat memasukkan aturan lain dalam awk untuk menambah atau menghapus entri sesuai kebutuhan.

EDIT: sama halnya dengan ifconfig (seperti yang ditunjukkan Doug)

ifconfig | awk '{print $1}'

Ini adalah contoh tidak termasuk antarmuka 'lo'

ifconfig | awk '{if ($1 != lo) print $1}'
MaQleod
sumber
Itu tidak akan berhasil. awkakan mengabaikan spasi putih terdepan dan mencetak kata pertama di setiap baris berikutnya juga.
Doug Harris
Sayangnya, itu memang tidak bekerja, menderita masalah persis yang ditunjukkan Doug. Tetapi terima kasih atas bantuan Anda, namun saya sangat menghargai Anda membantu yang baru seperti saya.
ftiaronsem
1
/usr/sbin/ip addr show | awk '/^[1-9]/ {print $2}'

menyediakan

lo:
eth0:
eth1:
eth2:

sebagai output

Promod
sumber
1

Meskipun ada solusi yang diterima, saya ingin menyajikan solusi saya untuk ini.

Saya memiliki banyak antarmuka virtual, dan ingin mendapatkan daftar, dapat digunakan dalam berbagai skrip 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

Saya tidak tertarik dengan loopback, karena saya tahu itu ada di sana :)

One-liner ini menyelesaikan pekerjaan:

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

Menghasilkan keluaran seperti:

eth0
eth0:1
eth0:2
eth0:3

Nikmati.

Mogens TrasherDK
sumber
1

Semua solusi di atas berfungsi dengan baik. Anda masih bisa Coba ini

ifconfig | grep HW | cut -c 1-6

Karena, loyang merupakan loopback, tidak diberi alamat HW, itu tidak akan muncul.

Keluaran -

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

Solusi termudah adalah di man ifconfig (8)

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

Bendera -l dapat digunakan untuk membuat daftar semua antarmuka yang tersedia pada sistem, tanpa informasi tambahan lainnya. Penggunaan flag ini saling eksklusif dengan semua flag dan perintah lain, kecuali untuk -d (hanya antarmuka daftar yang turun) dan -u (hanya antarmuka daftar yang naik).

Jadi, untuk memiliki daftar, gunakan:

ifconfig -l

Nama-nama akan dipisahkan oleh spasi sehingga Anda harus menggunakan sed untuk mengganti spasi ini dengan \ n:

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

Syberam
sumber
1

Ditingkatkan:

netstat -i | grep '^[a-z]' | awk '{print $1}' | grep -v 'lo'
Bob Smith
sumber
1
Anda mungkin harus membuatnya grep -v '^lo$'; perintah Anda saat ini akan mengecualikan (contoh hipotetis) logicaldan ridiculousantarmuka.
Scott
0

Tidak ada solusi di atas yang berfungsi untuk saya, berikut adalah solusi saya:

ifconfig -a  | egrep "^[a-z]+" | sed "s/: .*//" | grep -v "lo"
  1. Daftar semua antarmuka yang tersedia
  2. Ekstrak hanya garis yang berisi nama perangkat (tidak ada spasi di awal)
  3. Hapus bagian trailing yang tidak terkait yang setelah dari ruang pertama
  4. Kecualikan loantarmuka

Output:

eth0
eth0:1
wlan0
ceremcem
sumber
0

"ifcongif -l" harus melakukan pekerjaan. outputnya seperti ini "lo0 gif0 stf0 en0 ..." tanpa baris baru.

Saya menemukannya di beberapa situs web tetapi saya tidak dapat menemukannya lagi. dan saya masih mencari arti dari Bendera "-l" itu.

JIWA TUA
sumber
0

Kadang-kadang nettools tidak diinstal secara default. Jadi, saya suka menggunakan perintah bawaan yang memiliki lebih banyak jaminan untuk ditemukan di dalam / bin, / usr / bin, dan / usr / sbin tanpa harus khawatir tentang paket-paket pos yang diinstal.

ip addr: tampilkan / manipulasi perutean, perangkat, perutean kebijakan dan terowongan (alamat)
grep: cari spasi lalu apa saja setelah unitl:
cut: use (:) sebagai pembatas dan dapatkan bidang 2
tr: hapus spasi apa saja

$ ip addr | grep -E ': \ s. * ?:' | cut -d ":" -f 2 | tr -d ""
Joseph Steven Martinez
sumber
0

Diuji pada macOS, berikut ini berfungsi. Saya perlu menemukan semua antarmuka yang UP. Ini berdasarkan jawaban dari Dennis Williamson di atas.

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

tipuan
sumber
-1

ifconfig | grep flags | awk -F: '{print $1;}'

ttbakiatwoam
sumber
1
Bisakah Anda memperluas dan menjelaskan apa yang dilakukannya? Jawaban satu baris umumnya bukan format yang baik untuk Superuser.
Doktoro Reichard