
Ich möchte die folgende Ausgabe wie folgt manipulieren:
Ausgabe:
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
Wenn ich nach 100.0.153.164/32 filtere, wird die folgende Ausgabe gedruckt:
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
Wenn ich nach 0.0.0.0/0 filtere, wäre die Ausgabe:
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]
Und wenn ich nach etwas wie 10.20.0.4/32 filtere, wäre die Ausgabe:
S 10.20.0.4/32 [10/0] is directly connected, VPN-AX4B
Aber ich bin nicht gut darin, deshalb komme ich nicht dahinter :(
Antwort1
Wenn Sie eine Übereinstimmung mit einer gegebenen Zeichenfolge im zweiten Feld erzielen und „Fortsetzungszeilen“ ausdrucken möchten, nachdem diese Zeichenfolge übereinstimmt, versuchen Sie es mit diesem awk-Skript.
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_
Ich habe es aufgeteilt, damit es leichter lesbar ist.
Grundsätzlich beginnen Sie damit, die Variable havematch auf Null zu initialisieren, da Sie am Anfang keine Übereinstimmungen haben. Dann prüfen Sie, ob eine Zeile mit „----“ beginnt. Wenn dies der Fall ist und die Variable havematch gesetzt ist, drucken Sie diese Zeile aus, da es sich um eine „Fortsetzungszeile“ handelt. Wenn die Zeile mit „----“ beginnt und die Variable havematch auf Null gesetzt ist, handelt es sich um eine Fortsetzungszeile für etwas anderes. Drucken Sie sie nicht aus. Wenn die Zeile mit „----“ beginnt, fahren Sie nach der Prüfung havematch mit der nächsten Zeile fort.
Wenn das zweite Feld in der Zeile mit Ihrer Filterzeichenfolge übereinstimmt, drucken Sie die Zeile aus und setzen Sie die Variable havematch auf eins. Fahren Sie mit der nächsten Zeile fort.
Wenn die Zeile keine Fortsetzungszeile ist und das zweite Feld nicht mit Ihrer Filterzeichenfolge übereinstimmt, stimmt diese Zeile nicht überein und Sie möchten keine Fortsetzungszeilen ausdrucken. Setzen Sie daher die Variable havematch auf Null.
Hoffe das hilft.