awk 作为 ifconfig 过滤器

我是整个 awk 工具的新手,对我来说似乎很复杂。

示例 ifconfig 输出:

enp2s0f1: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        ether xx:xx:xx:xx:xx:xx  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

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 1000  (Local Loopback)
        RX packets 338  bytes 27536 (26.8 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 338  bytes 27536 (26.8 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

wlp3s0: flags=4163<UP,RUNNING,MULTICAST>  mtu 1500
        inet xxx.xxx.xxx.xxx  netmask xxx.xxx.xxx.x  broadcast xxx.xxx.xxx.xxx
        inet6 xxxx::xxxx:xxxx:xxxx:xxxx  prefixlen 64  scopeid 0x20<link>
        ether xx:xx:xx:xx:xx:xx  txqueuelen 1000  (Ethernet)
        RX packets 143296  bytes 172270775 (164.2 MiB)
        RX errors 0  dropped 5  overruns 0  frame 0
        TX packets 32786  bytes 6774762 (6.4 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

到目前为止,我得到了一个用于 ifconfig 过滤器的命令,它会丢弃环回以及其他不需要的东西。

ifconfig | awk 'BEGIN{ORS=RS="\n\n"} !/^lo/{print}' | awk '{print $1,$2}' | awk '!/^RX/{print}' | awk '!/^TX/{print}'

这是一个输出:

enp2s0f1: flags=4099<UP,MULTICAST>
ether xx:xx:xx:xx:xx:xx
 
wlp3s0: flags=4163<UP,MULTICAST>
inet xxx.xxx.xxx.xxx
inet6 xxxx::xxxx:xxxx:xxxx:xxxx
ether xx:xx:xx:xx:xx:xx

我研究了类似的问题,但我想知道如何使用 awk

从中间切线

我已经尝试过这样的一行: awk '!/flags=/{print}' 但它删除了包含 flags

的整行

所需的输出:

enp2s0f1:
ether xx:xx:xx:xx:xx:xx

wlp3s0:
inet xxx.xxx.xxx.xxx
ether xx:xx:xx:xx:xx:xx
ying_09222 回答:awk 作为 ifconfig 过滤器

你可以试试这个awk

ifconfig |
awk '
/^[[:alnum:]]+: / { # if we encounter an interface name
   n = $1           # save name in variable n
   p = 1            # set flag p=1
}
# interface does not start with "lo" and protocols are inet or ether
n !~ /^lo/ && /^[[:blank:]]+(inet|ether) / {
   if (p) {         # if flag is set
      print n       # print interface name
      p = 0         # reset flag p=0
   }
   print $1,$2     # print protocol and address
}'
,
$ cat tst.awk
/^[[:alnum:]]/ {
    f = ($1 == "lo:" ? 0 : 1)
    if (f) {
        print sep $1
        sep = ORS
    }
}
f && ($1 ~ /^(ether|inet)$/) {
    print $1,$2
}

$ awk -f tst.awk file
enp2s0f1:
ether xx:xx:xx:xx:xx:xx

wlp3s0:
inet xxx.xxx.xxx.xxx
ether xx:xx:xx:xx:xx:xx
,

我发现这个命令更有助于过滤 ifconfig 命令中不需要的内容:

del l2

eth0 - 获取 eth0 ip 详细信息 inet - 只显示包含 inet 的字符串 cut -d:这会将所有包含字符串的 inet 转换为列表 -f2 访问第二个字符串/行 awk '{print $2}' 得到想要的输出,其中 $2- 用于第二个位置的字符串索引

,
ifconfig | awk '/^lo/,/\n\n/{ e=1 }!e && $1!~/^(RX|TX)$/{ print $1,$1~/:/?"":$2}'
  • /^lo/,/\n\n/ 会将环回部分的 e 设置为 1。

  • 我们只在 e 等于 0 并且

    如果第一个元素不以 RT 开头。

  • 最后,只有 print $2 is $1 不包含 :

本文链接:https://www.f2er.com/706672.html

大家都在问