答案1
ifconfig
的输出在每个界面之间有一个空行,使其非常适合以“段落模式”使用awk
或等脚本语言进行读取和处理perl
。 “段落”是由一个或多个空行与其他块分隔开的任何文本块。
例如:
ifconfig | awk -v RS='' '/^s1-eth[12]:/ {print}'
awk
上面的示例将 的记录分隔符 ( ) 设置为awk
空RS
字符串,使其处理段落而不是单独的行。在这种情况下,将测试每个段落是否匹配^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 -An
n以下是,但这有点凌乱,因为行数可能会有所不同。
可能更好用awk
。这将打印所有以enp1
或开头的部分enp3
。如果该行不以空格开头,第一条规则!/^ / {p=0}
将清除变量;如果该行以我们想要的接口名称开头,第二条规则将设置该变量,然后打印是否已设置。以空格开头的行仅匹配最后一条规则,因此它们是根据 的先前值打印的。p
/^enp[13]/ {p=1}
p
p
# /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 输出。