如何仅显示以某种模式开头的界面

如何仅显示以某种模式开头的界面

Open-Vswitch 创建虚拟接口,它们都有这样的模式:s[digit]-eth[digit]例如:s1-eth1, s1-eth2, s12-eth3, s2-eth3 ...

我想显示以下信息-例如-所有以 s1 开头的接口(在我们的示例中,它必须给出s1-eth1s1-eth2)

我尝试了这个命令,但它只显示第一行信息:

在此输入图像描述

我对这样的信息更感兴趣RX packets, TX packets, erros, HWaddr..

在此输入图像描述

答案1

ifconfig的输出在每个界面之间有一个空行,使其非常适合以“段落模式”使用awk或等脚本语言进行读取和处理perl。 “段落”是由一个或多个空行与其他块分隔开的任何文本块。

例如:

ifconfig | awk -v RS='' '/^s1-eth[12]:/ {print}'

awk上面的示例将 的记录分隔符 ( ) 设置为awkRS字符串,使其处理段落而不是单独的行。在这种情况下,将测试每个段落是否匹配^s1-eth[12]:,如果匹配则打印。

我的系统的输出示例:

$ ifconfig | awk -v RS='' '/^(ppp0|lo):/ {print}'
lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 64237556  bytes 36962222928 (34.4 GiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 64237556  bytes 36962222928 (34.4 GiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
ppp0: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST>  mtu 1412
        inet ip.ip.ip.ip  netmask 255.255.255.255  destination ip.ip.ip.ip
        ppp  txqueuelen 3  (Point-to-Point Protocol)
        RX packets 28220997  bytes 19305565357 (17.9 GiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 21719890  bytes 3009382446 (2.8 GiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

请注意,这不再按段落打印 - 每个接口“记录”之间没有空行。如果您希望在输出中包含段落,请将输出记录分隔符 ( ORS) 设置为两个换行符 ( \n\n)。例如

ifconfig | awk -v RS='' -v ORS='\n\n' '/^(ppp0|lo):/ {print}'

ip使用's 的输出而不是's执行类似的操作ifconfig稍微复杂一些。 ip不会产生整齐的段落分隔输出。然而,它确实在一个块中输出每个接口,其中接口的编号后跟一个冒号,行首有一个空格,后面是该接口的其余详细信息。

要利用此功能,请将 RS 设置为正则表达式 ( (^|\n)[0-9]+:)。匹配任何后跟冒号和空格 ( [0-9]+:) 的数字任何一个在文件的开头(^,以匹配第一条记录,否则将被跳过)或紧接在换行符之后。

例如,在我的系统上:

$ ip addr | awk -v RS='(^|\n)[0-9]+: ' '/^(lo|eth0):/ {print}'
lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master br0 state UP group default qlen 1000
    link/ether 01:33:ed:b0:13:a9 brd ff:ff:ff:ff:ff:ff

(我的eth0没有任何 IP 地址,因为我将其设置为虚拟机和 docker 容器的桥接器。IP 地址位于接口上br0

答案2

您可以使用打印匹配行和grep -Ann以下是,但这有点凌乱,因为行数可能会有所不同。

可能更好用awk。这将打印所有以enp1或开头的部分enp3。如果该行不以空格开头,第一条规则!/^ / {p=0}将清除变量;如果该行以我们想要的接口名称开头,第二条规则将设置该变量,然后打印是否已设置。以空格开头的行仅匹配最后一条规则,因此它们是根据 的先前值打印的。p/^enp[13]/ {p=1}pp

# /sbin/ifconfig -a  |awk '!/^ / {p=0} /^enp[13]/ {p=1}; p'
enp1s0    Link encap:Ethernet  HWaddr ... 
          inet addr:...
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:135284106 errors:0 dropped:0 overruns:0 frame:0
          TX packets:144695 errors:0 dropped:0 overruns:0 carrier:2
          collisions:0 txqueuelen:1000 
          RX bytes:8292624956 (8.2 GB)  TX bytes:16595674 (16.5 MB)
enp3s0    Link encap:Ethernet  HWaddr ...  
          BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

就您而言,您当然会使用类似 的模式/^s1-eth/

答案3

我想显示 - 例如 - 以以下开头的所有接口的信息s1

使用net-tools

ifconfig | grep s1 -A9

使用iproute2

ip -s link | grep s1 -A7

答案4

对于后处理,对于较新版本的iproute2您可能需要使用专用于此目的的 JSON 输出格式:

ip -j -s link show |
  jq -r '
    .[]|
    select(.ifname|test("^s\\d+-eth\\d+$"))|
    [.ifname, .stats64.rx.bytes, .stats64.tx.bytes]|
    @csv'

例如,获取包含接口名称、RX 和 TX 字节的 CSV 输出。

相关内容