awk 和带斜杠的模式

awk 和带斜杠的模式

输入数据包含行:

Network:   10.1.0.0/24          00001010.00000001.00000000. 00000000
Network:   10.1.1.0/24          00001010.00000001.00000001. 00000000
Network:   10.1.2.0/24          00001010.00000001.00000010. 00000000
Network:   10.1.3.0/24          00001010.00000001.00000011. 00000000
Network:   10.1.4.0/24          00001010.00000001.00000100. 00000000
Network:   10.1.5.0/24          00001010.00000001.00000101. 00000000
Network:   10.1.6.0/24          00001010.00000001.00000110. 00000000
Network:   10.1.7.0/24          00001010.00000001.00000111. 00000000

我想使用 awk 获取输出 $2 列。我尝试过的没有返回任何内容:

$ ipcalc 10.1.1.0/21 /24|gawk '$1~/^Network:.+\/24[[:space:]]+/{print $2}'

当我将正则表达式与 grep 一起使用时,它确实可以正常工作:

$ ipcalc 10.1.1.0/21 /24|grep -E "^Network:.+\/24[[:space:]]+"
Network:   10.1.0.0/24          00001010.00000001.00000000. 00000000
Network:   10.1.1.0/24          00001010.00000001.00000001. 00000000
Network:   10.1.2.0/24          00001010.00000001.00000010. 00000000
Network:   10.1.3.0/24          00001010.00000001.00000011. 00000000
Network:   10.1.4.0/24          00001010.00000001.00000100. 00000000
Network:   10.1.5.0/24          00001010.00000001.00000101. 00000000
Network:   10.1.6.0/24          00001010.00000001.00000110. 00000000
Network:   10.1.7.0/24          00001010.00000001.00000111. 00000000

awk (gawk) 是否需要另一种解决方法?

答案1

要模拟 grep 命令,请将其更改$1~$0~或仅将其删除:

awk '/^Network:.+\/24[[:space:]]+/{print $2}'

或者使其更加健壮和可移植(适用于所有 awks 而不仅仅是 POSIX awks):

awk '($1 == "Network:") && ($2 ~ "/24$"){print $2}'

您的代码的问题是您正在测试$1整个表达式,但$1仅包含第一个字段,即Network:.

答案2

使用您显示的示例,请尝试以下 GNUgrep解决方案。仅使用所示示例进行编写和测试。

grep -oP '^Network:\s+\K([0-9]{1,3}\.){3}[0-9]{1,3}\/24'  Input_file

相关内容