แสดงรายการเฉพาะชื่ออุปกรณ์ของอินเทอร์เฟซเครือข่ายที่มีทั้งหมด


20

ฉันต้องการรับรายการ Network-Device Names ที่มีอยู่ทั้งหมดบนเซิร์ฟเวอร์ 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" แต่ฉันไม่รู้ว่าจะตัดข้อมูลที่ไม่จำเป็นออกไปได้อย่างไร

คำตอบ:


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

ดูเหมือนว่าจะใช้งานได้กับ OS X:ifconfig -a | sed -E 's/[[:space:]:].*//;/^$/d'
Dennis Williamson

21

ทางเลือกอื่นจะเป็น:

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

+1 สำหรับ-o- ไม่ทราบ
Patryk


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;}' พิมพ์ฟิลด์แรกก่อนเครื่องหมายโคลอน

ขอบคุณมากโดยเฉพาะคำตอบที่อธิบายรายละเอียดเกี่ยวกับพารามิเตอร์ที่ใช้แล้ว หากฉันจะมีปัญหาที่คล้ายกันในอนาคตฉันรู้ว่าโพสต์ใดที่จะดู ;-) โชคไม่ดีที่มันไม่ได้ตัด "ทองหล่อ" ดังนั้นคำตอบที่ได้รับการยอมรับจะไปที่เดนนิส แต่ตอนนี้มันเป็นคำตอบที่มีประโยชน์มากขอบคุณ :-)
ftiaronsem

เพิ่ม| grep -v lo:-)
Doug Harris


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 fooในgrepคำสั่ง


วิธีการแก้ปัญหาของคุณทำงานได้ดีเท่า ๆ กับเดนนิส โชคไม่ดีที่ฉันไม่ยอมรับสองโพสต์ดังนั้นเดนนิสก็เร็วขึ้น แต่ขอบคุณโดยเฉพาะอย่างยิ่งสำหรับคำอธิบาย grep ของคุณ
ftiaronsem

1

เพียงพิมพ์คอลัมน์แรก:

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

คุณสามารถรวมกฎอื่น ๆ ใน awk เพื่อเพิ่มหรือลบรายการได้ตามต้องการ

แก้ไข: เดียวกันไปกับ ifconfig (เช่นดั๊กชี้ให้เห็น)

ifconfig | awk '{print $1}'

นี่คือตัวอย่างที่ไม่รวมส่วนต่อประสาน 'lo'

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

นั่นไม่ได้ผล awkจะละเว้นพื้นที่สีขาวนำหน้าและพิมพ์คำแรกในแต่ละบรรทัดถัดไปเช่นกัน
Doug Harris

โชคไม่ดีที่ไม่ได้ทำงานอย่างแท้จริงทุกข์ทรมานกับปัญหาที่แน่นอนดั๊กชี้ให้เห็น แต่ขอบคุณสำหรับความช่วยเหลือจากคุณอย่างไรก็ตามฉันขอขอบคุณที่คุณช่วยเป็นอย่างใหม่โดยฉัน
ftiaronsem


1

แม้ว่าจะมีวิธีการแก้ปัญหาที่ยอมรับได้ แต่ฉันก็อยากจะนำเสนอวิธีแก้ปัญหานี้

ฉันมีอินเตอร์เฟสเสมือนจำนวนมากและต้องการรับรายการสามารถใช้งานได้ในสคริปต์ทุบตีต่างๆ

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ซึ่งเป็นลูปแบ็คจึงไม่ได้กำหนดที่อยู่ HW มันจะไม่ปรากฏขึ้น

ผลผลิต -

root @ glum: / home / amit # ifconfig | grep HW | ตัด -c 1-6
enp7s0
VMnet1
vmnet8
wlp6s0

1

ทางออกที่ง่ายที่สุดคือใน ifconfig คน (8)

สารสกัดจากคน 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$'เช่นนั้น คำสั่งปัจจุบันของคุณจะไม่รวม (ตัวอย่างสมมุติ) logicalและridiculousอินเทอร์เฟซ
สกอตต์

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

บางครั้งเน็ตเวิร์กจะไม่ถูกติดตั้งตามค่าเริ่มต้น ดังนั้นฉันชอบใช้คำสั่งในตัวที่มีการรับประกันมากขึ้นที่จะพบภายใน / bin, / usr / bin และ / usr / sbin โดยไม่ต้องกังวลกับแพคเกจติดตั้งโพสต์

ip addr: แสดง / จัดการการจัดเส้นทางอุปกรณ์นโยบายการกำหนดเส้นทางและช่องสัญญาณ (ที่อยู่)
grep: ค้นหาช่องว่างแล้วทุกอย่างหลังจาก unitl:
cut: use (:) เป็นตัวคั่นและรับฟิลด์ 2
tr: ลบช่องว่างใด ๆ

$ ip addr | grep -E ': \ s. * ?:' | ตัด -d ":" -f 2 | tr -d ""

-1

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


1
คุณช่วยอธิบายขยายท้ายสิ่งนี้ได้อย่างไร คำตอบหนึ่งบรรทัดโดยทั่วไปแล้วไม่ใช่รูปแบบที่ดีสำหรับ Superuser
Doktoro Reichard
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.