操作輸出 - awk|sed|grep

操作輸出 - awk|sed|grep

我想像這樣操作以下輸出:

輸出:

S*      0.0.0.0/0 [1/0] via 1.1.1.1, MAR-LNK-VGL_DSL
                  [1/0] via 2.2.2.2, MAR-LNK-GVT_DSL
                  [1/0] via 3.3.3.3, ENT-LNK-OI_CORP
                  [1/0] via 4.4.4.4, ENT-EBT_CORP, [10/0]
S       10.0.0.0/16 [10/0] via 5.5.5.5, ENT-LNK
C       10.5.10.0/24 is directly connected, MAR-DEV-LAN
C       10.5.20.0/24 is directly connected, MAR-DEV-DMZ
C       10.5.30.0/24 is directly connected, MAR-DEV-BALANCE
C       10.6.40.0/28 is directly connected, BNC-HOM
C       10.6.40.3/32 is directly connected, BNC-HOM
B       10.7.0.0/21 [20/100] via 6.6.6.6, vpn-21fce533-0, 03:12:51
S       10.19.210.56/29 [10/0] via 7.7.7.7, MAR-EMB_MPLS
S       10.19.233.0/24 [10/0] is directly connected, VPN-HML-PP
S       10.19.252.0/24 [5/0] is directly connected, VPN-CON
B       10.19.254.0/24 [20/0] via 8.8.8.8, ENT_EBT_MPLS, 4d20h13m
S       10.20.0.4/32 [10/0] is directly connected, VPN-AX4B
S       10.33.13.70/32 [10/0] is directly connected, VPN-NEW
B       10.50.0.0/17 [20/0] via 9.9.9.9, SEC-EQNX, 00:02:11
B       10.50.128.0/17 [20/0] via 9.9.9.9, SEC-EQNX, 00:02:11
O       100.0.153.164/32 [110/200] via 99.1.152.61, HUB-MAR-03_79, 17:36:22
                         [110/200] via 99.1.101.217, HUB-MAR-04_54, 17:36:22
                         [110/200] via 99.1.101.153, HUB-MAR-04_38, 17:36:22
                         [110/200] via 99.1.151.13, HUB-MAR-03_3, 17:36:22
O       100.0.252.11/32 [110/200] via 99.1.151.109, HUB-MAR-03_15, 03:22:24
                        [110/200] via 99.1.102.17, HUB-MAR-04_68, 03:22:24

如果我過濾 100.0.153.164/32,它將列印以下輸出:

O       100.0.153.164/32 [110/200] via 99.1.152.61, HUB-MAR-03_79, 17:36:22
                         [110/200] via 99.1.101.217, HUB-MAR-04_54, 17:36:22
                         [110/200] via 99.1.101.153, HUB-MAR-04_38, 17:36:22
                         [110/200] via 99.1.151.13, HUB-MAR-03_3, 17:36:22

如果我過濾 0.0.0.0/0,輸出將是:

S*      0.0.0.0/0 [1/0] via 1.1.1.1, MAR-LNK-VGL_DSL
                  [1/0] via 2.2.2.2, MAR-LNK-GVT_DSL
                  [1/0] via 3.3.3.3, ENT-LNK-OI_CORP
                  [1/0] via 4.4.4.4, ENT-EBT_CORP, [10/0]

如果我過濾類似 10.20.0.4/32 的內容,輸出將是:

S       10.20.0.4/32 [10/0] is directly connected, VPN-AX4B

但我不太擅長,所以我無法弄清楚:(

答案1

如果您想要匹配第二個欄位中的給定字串,並在該字串匹配後列印出“連續行”,請嘗試使用此 awk 腳本。

awk -v fltr="_str_" 'BEGIN {havematch=0}
 {if ($1 ~ /^----/) {
   if (havematch == 1) {
     print $0
   }
   next
  }
  if ($2 == fltr) {
    print $0
    havematch=1
    next
  }
  {havematch=0}
 }' _file_

我已將其分解以使其更易於閱讀。

基本上,您首先將 hasmatch 變數初始化為零,因為一開始沒有任何匹配項。然後,檢查一行是否以“----”開頭如果是,並且設置了havematch變量,則打印出該行,因為它是“延續行”如果該行以“----”開頭並且hasmatch 設定為零,那麼這是其他內容的延續行。不要列印它。無論哪種方式,如果該行以“----”開頭,則在進行 hasmatch 檢查後,移至下一行。

如果該行中的第二個欄位與您的過濾字串匹配,請列印該行並將 havematch 變數設為 1。轉到下一行。

如果該行不是連續行,且第二個欄位與您的過濾字串不匹配,則該行不匹配,並且您不想列印任何連續行。因此,將 hasmatch 變數設為零。

希望這可以幫助。

相關內容