powershell:拆分输出并在select-string后打印

时间:2018-06-01 21:06:40

标签: powershell windows-10

首先,这是我第一次使用PowerShell。一切都很新鲜。我的脚本看起来像这样。

select * from 
(
select a.[member id]
    , b.[enrollment id]
    , c.[effective date]
    , c.[term date]
    , c.[last update]
    , row_number() over (partition by a.[member id] order by c.[last update] desc) row_num
        from tbl1 a
            join tbl2 b on a.[member id] = b.[member id]
            join tbl3 c on b.[enrollment id] = c.[enrollment id]
) x
where row_num = 1
;

我收到一封包含搜索字符串的所有行的成功电子邮件,它看起来像下面的内容。

$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 并尝试将每个字符串转换为变量并使用它们但我不能。即使我这样做,也应该有更好的方法来做到这一点。任何帮助表示赞赏。感谢。

2 个答案:

答案 0 :(得分:3)

查看-replace运算符和regular expressions。要从源格式转换为所需格式,您可以执行以下操作:

$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'

此代码使用一个简单(但相当长)的正则表达式从源字符串中提取子匹配,然后使用后引用将新字符串替换为整个字符串,以将子匹配替换为字符串。

答案 1 :(得分:2)

Bruce Payette's helpful answer向您展示了如何通过正则表达式匹配的方面与令牌提取结合,使用{{1运营商。

提供替代方案,让-replace进行匹配,然后通过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不适用于OP,因此这是一个直接使用近似等效.NET方法的变体解决方案:

-join