Bash

awk 和帶斜線的模式

  • August 27, 2022

輸入數據包含以下行:

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:.

引用自:https://unix.stackexchange.com/questions/715135