Манипулирующий вывод - awk | sed | grep

344
Douglas

Я хотел бы манипулировать следующим выводом, как это:

Выход:

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
Вы просто хотите точное соответствие, или вам нужна программа для понимания сетей и подсетей? grawity 5 лет назад 0
скажем, что я запускаю эту команду с помощью grep - «получить информацию о маршрутизаторе маршрутизации всех | grep 0.0.0.0» - вывод будет: - «S * 0.0.0.0/0 [1/0] через 1.1.1.1, MAR- LNK-VGL_DSL "- я собираюсь увидеть только путь через 1.1.1.1, но на самом деле я могу добраться до 0.0.0.0 через 2.2.2.2, 3.3.3.3 и 4.4.4.4. Я хочу что-то, что показывает мне все пути, через каждый возможный следующий прыжок. Я просто хочу напечатать это. Douglas 5 лет назад 0
Вы просто хотите что-то, что соответствует строке во втором поле (например, 0.0.0.0/0) и печатает эту строку, и если строка начинается с «-----» и вы уже сопоставили предыдущую строку, распечатать строку, которая начинается с "-----" тоже? Lewis M 5 лет назад 0
Я думал, что-то вроде, напечатать все, начиная со строки, которая соответствует определенной строке (например, 0.0.0.0/0), и остановиться, когда есть что-то в 1ª столбце (например, S, O, C или B) новая линия. Douglas 5 лет назад 0
[MCVE] (https://stackoverflow.com/help/mcve) Thor 5 лет назад 0

1 ответ на вопрос

0
Lewis M

Если вы хотите сопоставить данную строку во втором поле и распечатать «строки продолжения» после сопоставления этой строки, попробуйте этот сценарий awk.

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

Я разбил его, чтобы было легче читать.

По сути, вы начинаете с инициализации переменной hasmatch равной нулю, так как в начале у вас нет совпадений. Затем вы проверяете, начинается ли строка с «----», если это так, и переменная havematch установлена, вы выводите эту строку, поскольку она является «строкой продолжения». Если строка начинается с «----» и hasmatch установлен на ноль, тогда это продолжение строки для чего-то еще. Не печатайте это. В любом случае, если строка начинается с «----», после проверки hasmatch перейдите к следующей строке.

Если второе поле в строке соответствует вашей строке фильтра, распечатайте строку и установите переменную havematch равной единице. Перейти к следующей строке.

Если строка не является строкой продолжения, а второе поле не соответствует строке фильтра, то эта строка не совпадает, и вы не хотите распечатывать строки продолжения. Итак, установите переменную havematch на ноль.

Надеюсь это поможет.

Спасибо, мужик!! : D Douglas 5 лет назад 0
Пожалуйста. Помните, если вам это нравится, и это приемлемый ответ, пожалуйста, проголосуйте и примите это как ответ. Благодарю. Lewis M 5 лет назад 0

Похожие вопросы