2014-01-21 8 views
0

Я пытаюсь очистить некоторые данные, которые я получаю от команды. Проблема заключается в том, что данные повторяются для разных случаев и распространяются по нескольким линиям. Я добавил данные в конце вопроса.Regex Matching Some Lines

Я пытаюсь захватить Domain|Private|Public с их состоянием ON|OFF

пример вывода будет этот

Domain OFF 
Private ON 
Public OFF 

из-за множественных линий и мое ограниченное знание Regex, я могу соответствовать только одна строка , Может кто-нибудь, пожалуйста, помогите мне с этим регулярным выражением.

Образец данных:

Domain Profile Settings: 
---------------------------------------------------------------------- 
State         OFF 
Firewall Policy      BlockInbound,AllowOutbound 
LocalFirewallRules     N/A (GPO-store only) 
LocalConSecRules      N/A (GPO-store only) 
InboundUserNotification    Enable 
RemoteManagement      Enable 
UnicastResponseToMulticast   Enable 

Logging: 
LogAllowedConnections     Disable 
LogDroppedConnections     Disable 
FileName        %systemroot%\system32\LogFiles\Firewall\pfirewall.log 
MaxFileSize       4096 


Private Profile Settings: 
---------------------------------------------------------------------- 
State         OFF 
Firewall Policy      BlockInbound,AllowOutbound 
LocalFirewallRules     N/A (GPO-store only) 
LocalConSecRules      N/A (GPO-store only) 
InboundUserNotification    Enable 
RemoteManagement      Enable 
UnicastResponseToMulticast   Enable 

Logging: 
LogAllowedConnections     Disable 
LogDroppedConnections     Disable 
FileName        %systemroot%\system32\LogFiles\Firewall\pfirewall.log 
MaxFileSize       4096 


Public Profile Settings: 
---------------------------------------------------------------------- 
State         OFF 
Firewall Policy      BlockInbound,AllowOutbound 
LocalFirewallRules     N/A (GPO-store only) 
LocalConSecRules      N/A (GPO-store only) 
InboundUserNotification    Enable 
RemoteManagement      Enable 
UnicastResponseToMulticast   Enable 

Logging: 
LogAllowedConnections     Disable 
LogDroppedConnections     Disable 
FileName        %systemroot%\system32\LogFiles\Firewall\pfirewall.log 
MaxFileSize       4096 

Ok. 
+0

На каком языке вы используете? Что вы пробовали? –

+0

Какое приложение вы используете? Похоже, это должно быть довольно просто, используя 'awk'. – Barmar

+0

Регулятор командной строки Powershell. В настоящее время тестирование в regexpal.com также [\ n \ r]. * State \ s * ([^ \ n \ r] *) - мой последний код –

ответ

1

Это решило мой вопрос:

%{$_.Replace(' Profile Settings: ', '')} | 
      where {$_ -match '(Domain|Public|Private|State)'} | 
      %{$_ -Replace('State *','')} 

Спасибо за помощь, ребята!

3
(Domain|Public|Private).*?^State\s+(ON|OFF) 

Вам необходимо включить dotall и multiline флаги - как сделать это зависит от конкретной среды.

Регулярное выражение, чтобы первым распознает и сохраняет в области видимости ключевого слова, а затем пропускает нежадным количество случайных символов, пока State строка не встречается в начале линии (за счет ^ характера), а затем произвольное количество пробельных символов разрешено перед встречей ON или OFF. Как область действия, так и состояние возвращаются как фактические совпадения. Использование .*? в середине гарантирует, что совпадение также работает, если State не находится в первой строке.

Sample here.

3

Предполагая, что вы используете совместимый регулярное выражение PCRE, это должно сделать это:

/(Domain|Public|Private)\s+.*?State\s+(ON|OFF)/gs 

Демо: http://regex101.com/r/pG3iI6

0

Попробуйте это:

$file = <filename to search> 
select-string -Pattern 'Domain|Private|Public Profile Settings' -Path $file -Context 0,2 | 
foreach {[PSCustomObject]@{ 
         Type = $_.line.split()[0] 
         Setting = $_.Context.PostContext[1].split()[-1] 
         } 
    } | ft -AutoSize 

Это использует -Context параметр Select-String, чтобы захватить следующие две строки после строки профиля и проанализировать параметр из PostContext. Вы можете захотеть заменить раскол на -replace, в зависимости от ваших данных.

+0

Получение ошибки: параметр Путь пуст, даже если Write-Host показывает его содержимое –

+0

Он работает для меня, используя файл с вашими тестовыми данными, скопированными на него (например, $ file = 'c: \ testfiles \ file1.txt'). – mjolinor