powershell: разделить вывод и напечатать после строки выбора - PullRequest
0 голосов
/ 02 июня 2018

Прежде всего, это мой первый раз с powershell.Все довольно новое.Мой сценарий выглядит примерно так:

$SMTPServer = "smtp.gmail.com"
$SMTPPort = "587"
$Username = "username@domain.com"
$Password = "password"

$to = "Username @domain.com"

$subject = "daily_check"
$body = (Get-Content 'C:\Users\xyz\Downloads\mylog.log' | Select-String 'string.string1.string2 - Request:') | Out-String

$message = New-Object System.Net.Mail.MailMessage
$message.subject = $subject
$message.body = $body
$message.to.add($to)
#$message.cc.add($cc)
$message.from = $username
#$message.attachments.add($attachment)

$smtp = New-Object System.Net.Mail.SmtpClient($SMTPServer, $SMTPPort);
$smtp.EnableSSL = $true
$smtp.Credentials = New-Object System.Net.NetworkCredential($Username, $Password);
$smtp.send($message)

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

INFO    2018-06-01 06:03:01,855 string.string1.string2 - Request: QWERTY- 123 Request: abc- XX1343XX123-01 Request: Type- BB
INFO    2018-06-01 11:06:54,551 string.string1.string2 - Request: QWERTY- 123 Request: abc- XX-12573XX123-00 Request:  Type- BB
INFO    2018-06-01 11:51:50,124 string.string1.string2 - Request: QWERTY- 123 Request: abc- 123XX122233-03 Request:  Type- BB
INFO    2018-06-01 12:20:15,076 string.string1.string2 - Request: QWERTY- 123 Request: abc- XX-12563XX123-00 Request:  Type- BB
INFO    2018-06-01 12:24:25,233 string.string1.string2 - Request: QWERTY- 123 Request: abc- XX-123XX12913-00 Request:  Type- BB

Но я ожидаю, что мой вывод будет выглядеть примерно так ниже.

2018-06-01 06:03:01, QWERTY- 123 abc- XX1343XX123-01 Type- BB
2018-06-01 11:06:54, QWERTY- 123 abc- XX-12573XX123-00 Type- BB
2018-06-01 11:51:50, QWERTY- 123 abc- 123XX122233-03 Type- BB
2018-06-01 12:20:15, QWERTY- 123 abc- XX-12563XX123-00 Type- BB
2018-06-01 12:24:25, QWERTY- 123 abc- XX-123XX12913-00 Type- BB

Я использовал -split ' ' и пытался преобразовать каждую строку в переменную и использовать их, ноЯ не могДаже если бы я это сделал, должен быть лучший способ сделать это.Любая помощь приветствуется.Спасибо.

Ответы [ 2 ]

0 голосов
/ 02 июня 2018

Полезный ответ Брюса Пайетта показывает, как объединить аспект соответствия через регулярное выражение с токеном извлечение , используя -replace operator.

Чтобы предложить альтернативу, которая позволяет Select-String выполнить сопоставление и затем обработать полученные строки с помощью -split:

Get-Content 'C:\Users\xyz\Downloads\mylog.log' |
  Select-String 'string\.string1\.string2 - Request:' |
    ForEach-Object { (-split $_)[1,2,6,7,9,10,12,13] -join ' ' }
  • -split разбивает каждую совпадающую строку (предоставляется через ForEach-Object как $_) на массив токенов по пробелам.

  • [1,2,6,7,9,10,12,13] затем извлекает токены с индексом 1, 2, ... в виде массива ...

  • ..., элементы которого -join ' ' объединяются, образуя разделенный пробелами список.

  • Как в стороне: обратите внимание, как . символов.в шаблоне, переданном в Select-String, экранируются как \., чтобы гарантировать, что они рассматриваются как литерал . символов, а не как метасимвол регулярного выражения ., что соответствует любому символу.

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

2018-06-01 06:03:01,855 QWERTY- 123 abc- XX1343XX123-01 Type- BB
2018-06-01 11:06:54,551 QWERTY- 123 abc- XX-12573XX123-00 Type- BB
2018-06-01 11:51:50,124 QWERTY- 123 abc- 123XX122233-03 Type- BB
2018-06-01 12:20:15,076 QWERTY- 123 abc- XX-12563XX123-00 Type- BB
2018-06-01 12:24:25,233 QWERTY- 123 abc- XX-123XX12913-00 Type- BB

Примечание. В отличие от вашего вопроса,вывод включает число, следующее за , во втором токене;например, 06:03:01,855, а не просто 06:03:01,.Если вы действительно хотите отбросить деталь после ,, требуется больше работы.


По неизвестным причинам использование операторов -split и -join не работает для OP, поэтому вотвариант решения, который использует почти эквивалентные методы .NET напрямую:

Get-Content 'C:\Users\xyz\Downloads\mylog.log' |
  Select-String 'string\.string1\.string2 - Request:' |
    ForEach-Object { [string]::Join(' ', ([regex]::split($_, '\s+')[1,2,6,7,9,10,12,13])) }
0 голосов
/ 02 июня 2018

Посмотрите на оператор -replace и регулярные выражения .Чтобы преобразовать из исходного формата в желаемый формат, вы можете сделать что-то вроде:

$p = "^INFO +([0-9:, -]+)string.string1.string2 - Request: ([a-z-]+) ([0-9]+) Request: ([a-z-]+) ([A-Za-z0-9-]+) Request: (.*$)"
$newstring = $oldstring -replace $p, '$1 $2 $3 $4 $5 $6'

Этот код использует простое (но довольно длинное) регулярное выражение для извлечения подстрок из исходной строки, а затем заменяет всю строкус новой строкой, использующей обратные ссылки для подстановки подстрок в строку.

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