Как использовать PowerShell select-string, чтобы найти строку, а затем копировать правую часть этой строки до тех пор, пока не начнется другая строка - PullRequest
0 голосов
/ 17 января 2020

Мне нужно сделать скрипт, который найдет «Ошибка» в файле журнала и после этой ошибки скопирует его описание, которое находится в отдельной строке. Мне удается найти и скопировать всю строку ошибки, но оказывается, что блок с описанием ошибки расположен немного ниже, и я не могу его скопировать.

Select-String C:\TEMP\Skript\Log.xml -Pattern ' level="ERROR" '  -AllMatches  |  select | out-file C:\TEMP\Skript\LogErrors.xml -append 

Как указать дополнительные параметры для поиск?

Комментарий находится в отдельном блоке и не совпадает с ошибкой. Этот блок не обязательно длиной в 1 строку.

<log4j:event logger="COMP" timestamp="1579174503853" level="ERROR" thread="1"><log4j:message>
here comes
a long error discription 
for a few lines.
</log4j:message>  

На этом описание ошибки заканчивается. Поэтому я должен найти ОШИБКУ в журнале, а затем скопировать эту строку и описание.

Ожидаемый результат: Получить каждую ошибку с ее описанием, даже если описание ошибки занимает несколько строк.

   <log4j:event logger="COMP" timestamp="1579174503853" level="ERROR" thread="1"><log4j:message>
here comes a long error discription  for a few lines.
 </log4j:message> 

1 Ответ

0 голосов
/ 24 января 2020

Учитывая информацию в файле Log. xml is:

    <log4j:event logger="COMP" timestamp="1579174503853" level="INFO" thread="1"><log4j:message>
    Information message
    </log4j:message>
    <log4j:event logger="COMP" timestamp="1579174503853" level="ERROR" thread="1"><log4j:message>
    here comes
    a long error discription 
    for three few lines.
    </log4j:message>
    <log4j:event logger="COMP" timestamp="1579174503853" level="INFO" thread="1"><log4j:message>
    Information message
    </log4j:message>
    <log4j:event logger="COMP" timestamp="1579174503855" level="ERROR" thread="1"><log4j:message>
    here comes a second long error discription 
    for a few lines.
    </log4j:message>
    <log4j:event logger="COMP" timestamp="1679174503855" level="ERROR" thread="1"><log4j:message>
    single line error. 
    </log4j:message>
    <log4j:event logger="COMP" timestamp="1579174503853" level="INFO" thread="1"><log4j:message>
    Information message
    </log4j:message>

Вы можете использовать следующую команду

    Get-Content .\Log.xml | foreach {
    if ($_.Contains('level="ERROR"')) {
    $errorFound= $true }
    if ($errorFound -And $_.StartsWith('<l')) { 
    $linea =""; $_ } 
    elseif($errorFound -And $_.StartsWith('</')) { 
    $linea + "`n" + $_ ; $errorFound = $false; } 
    elseif ($errorFound) { 
    $linea = $linea +  $_  }
    } | Add-Content LogError.xml

Это сохранит информацию в нужном формате файл LogError. xml

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...