Bash
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) 是否需要另一種解決方法?
要模擬您的 grep 命令更改
$1~
或$0~
刪除它:awk '/^Network:.+\/24[[:space:]]+/{print $2}'
或使其更健壯和可移植(適用於所有 awks 而不僅僅是 POSIX awks):
awk '($1 == "Network:") && ($2 ~ "/24$"){print $2}'
您的程式碼的問題是您正在測試
$1
整個表達式,但$1
僅包含第一個欄位,即Network:
.