Нужно искать строку из длинного конфигурационного файла с powershell - PullRequest
0 голосов
/ 10 мая 2018

Короче говоря, мне нужно найти определенную строку в длинном файле, который начинается с «set ip» и продолжается каким-то параметром, который мне нужно заменить.эта строка появляется в файле несколько раз, поэтому мне нужно найти ее между двумя конкретными строками.

Более длинная история: мы скоро получим возможность настроить множество межсетевых экранов FortiGate для наших офисов, большинство настроек, политики и т. д.будет то же самое, но меняются внешние IP-адреса, меняются некоторые другие адреса и т. д. Поэтому я пытаюсь создать скрипт powershell, который примет существующую конфигурацию (которая может измениться), найдет нужные мне строки и заменит их.Я пытался с регулярным выражением, но не мог заставить его работать для меня на нескольких строках.в основном для справки мне нужно найти «set ip» в следующей части:

config system interface
    edit "wan1"
        set vdom "root"
        set ip 7.7.7.7 255.255.255.252
        set allowaccess ping https ssh
        set ident-accept enable
        set type physical
        set scan-botnet-connections block
        set alias "WAN1"
        set role wan
        set snmp-index 1
    next

(IP был изменен в целях безопасности) и так далее.то, что я получил до сих пор:

get-content .\Fortigate.conf  | select-string -pattern "^#","set uuid " -notmatch

к сожалению, ничего, что я пытался вырезать эту часть текста, чтобы поиск только там работал.например с регулярным выражением я попытался:

get-content .\Fortigate.conf  | select-string -pattern "^#","set uuid " -notmatch | select-string -Pattern '(?m)edit "wan1".*?end'

1 Ответ

0 голосов
/ 10 мая 2018

Для этой проблемы я бы не стал пытаться отразить несколько строк, а подойти к нему с помощью PowerShell "Внедрить для середины конвейера" и запомнить информацию о том, в каком разделе вы находитесь, например ::10000 *

Прочитайте каждую конкретную строку (если вы пишете командлет, используйте раздел process метод ):

get-content .\Fortigate.conf  | ForEach {...

Запомните текущий раздел edit:

$Wan = ($_ | Select-String 'edit[\s]+"(.*)"').Matches.Groups[1].Value

Поймать определенный set в разделе (edit):

$SetIP = ($_ | Select-String 'set[\s]+ip[\s]+(.*)').Matches.Groups[1].Value

Принимайте решения на основе значений и разделов, например ::1010 *.

If ($Wan -eq $MyWan) {
    if (($SetIP -Split "[\s]+") -Contains $MyIP) {...

Удалите новую строковую запись (промежуточно) в конвейер:

Write-Output "        set ip $MyNewIP"

Или оставить исходную строку:

Else {Write-Output $_}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...