Awk 作为 ifconfig 过滤器
Awk as an ifconfig filter
我是整个 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,BROADCAST,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 , }' | awk '!/^RX/{print}' | awk '!/^TX/{print}'
这是一个输出:
enp2s0f1: flags=4099<UP,BROADCAST,MULTICAST>
ether xx:xx:xx:xx:xx:xx
wlp3s0: flags=4163<UP,BROADCAST,RUNNING,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
你可以试试这个awk
:
ifconfig |
awk '
/^[[:alnum:]]+: / { # if we encounter an interface name
n = # 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 , # print protocol and address
}'
$ cat tst.awk
/^[[:alnum:]]/ {
f = ( == "lo:" ? 0 : 1)
if (f) {
print sep
sep = ORS
}
}
f && ( ~ /^(ether|inet)$/) {
print ,
}
$ 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 命令中过滤不需要的内容更有帮助:
/sbin/ifconfig/ eth0 | grep 'inet' | cut -d: -f2 |awk '{print }'
eth0 - 获取 eth0 ip 详细信息
inet - 仅显示包含 inet 的字符串
cut -d:这会将所有包含字符串的 inet 转换为列表
-f2 访问第二个 string/line
awk '{print $2}' 获得期望输出,其中 $2- 用于第二个位置的字符串索引
ifconfig | awk '/^lo/,/\n\n/{ e=1 }!e && !~/^(RX|TX)$/{ print ,~/:/?"":}'
/^lo/,/\n\n/
会将环回部分的 e
设置为 1。
我们只在 e
等于 0 和
时打印一些东西
如果第一个元素不以 R
或 T
开头。
最后只打印</code>是<code>
不包含:
我是整个 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,BROADCAST,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 , }' | awk '!/^RX/{print}' | awk '!/^TX/{print}'
这是一个输出:
enp2s0f1: flags=4099<UP,BROADCAST,MULTICAST>
ether xx:xx:xx:xx:xx:xx
wlp3s0: flags=4163<UP,BROADCAST,RUNNING,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
你可以试试这个awk
:
ifconfig |
awk '
/^[[:alnum:]]+: / { # if we encounter an interface name
n = # 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 , # print protocol and address
}'
$ cat tst.awk
/^[[:alnum:]]/ {
f = ( == "lo:" ? 0 : 1)
if (f) {
print sep
sep = ORS
}
}
f && ( ~ /^(ether|inet)$/) {
print ,
}
$ 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 命令中过滤不需要的内容更有帮助:
/sbin/ifconfig/ eth0 | grep 'inet' | cut -d: -f2 |awk '{print }'
eth0 - 获取 eth0 ip 详细信息 inet - 仅显示包含 inet 的字符串 cut -d:这会将所有包含字符串的 inet 转换为列表 -f2 访问第二个 string/line awk '{print $2}' 获得期望输出,其中 $2- 用于第二个位置的字符串索引
ifconfig | awk '/^lo/,/\n\n/{ e=1 }!e && !~/^(RX|TX)$/{ print ,~/:/?"":}'
/^lo/,/\n\n/
会将环回部分的e
设置为 1。我们只在
时打印一些东西e
等于 0 和如果第一个元素不以
R
或T
开头。最后只打印
</code>是<code>
不包含: