Избавьтесь от повторяющихся полей в строке журнала - PullRequest
1 голос
/ 23 февраля 2020

У меня есть журналы строк, в которых информационные поля повторяются, первый раз они разделяются запятой и пробелом, второй раз они разделяются точкой с запятой, я хочу избавиться от их второго вхождения, слова (ВТОРОЕ) нет в журнале, я поставил его там, чтобы сделать его более понятным

targets:somehost state:Memory\Buffers=398672, Memory\Cached=4620216, Memory\MemFree=833748, Memory\MemTotal=8001352 (SECOND) Memory\Buffers=398672;Memory\Cached=4620216;Memory\MemFree=833748;Memory\MemTotal=8001352  type:Unix Resources

Я думал об использовании замены.

 %{$_ -replace "Memory\\Buffers=([0-9]+);Memory\\Cached=([0-9]+);Memory\\MemFree=([0-9]+);Memory\\MemTotal=([0-9]+)",""}

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

Ответы [ 2 ]

2 голосов
/ 23 февраля 2020

Предполагая, что все ваши строки журнала следуют шаблону вашей строки образца, и предполагая, что все поля, следующие за state:, повторяются, вы можете использовать следующее регулярное выражение (используя упрощенную входную строку, в которой поля Me\Bu=398672 и Me\Ca=4620216 повторяются):

'a:b c:Me\Bu=398672, Me\Ca=4620216 Me\Bu=398672;Me\Ca=4620216  d:e f' | % {
  $_ -replace '[^ ]+;[^ ]+  '
}

Приведенные выше значения:

a:b c:Me\Bu=398672, Me\Ca=4620216 d:e f
  • [^ ]+; соответствует первому полю в секунде вхождение списка полей.
  • [^ ]+ соответствует всем оставшимся полям во втором списке.
1 голос
/ 24 февраля 2020

Вы можете удалить все, начиная (включая) второе вхождение Memory\Buffers= с положительным look- за утверждением ((?<=...)):

$string -replace '(?<=Memory\\Buffers=.*?)\s*Memory\\Buffers.*$'

Как вы обнаружили, с положительным взглядом - впереди утверждение ((?=...)) вы можете указать, где останавливается вторая последовательность:

$string -replace '(?<=Memory\\Buffers=.*?)\s*Memory\\Buffers.*(?=\stype:)'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...