输入数据包含行:
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