gpt4 book ai didi

powershell - powershell:拆分输出并在选择字符串后打印

转载 作者:行者123 更新时间:2023-12-03 00:34:01 24 4
gpt4 key购买 nike

首先,这是我第一次使用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 ' '并尝试将每个字符串转换为变量并使用它们,但我做不到。即使我这样做,也应该有更好的方法来执行此操作。任何帮助表示赞赏。谢谢。

最佳答案

Bruce Payette's helpful answer向您展示了如何使用-replace运算符将通过正则表达式进行匹配的方面与 token 提取结合起来。

提供一种替代方法,让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提供为$_)拆分为 token 数组。
  • [1,2,6,7,9,10,12,13]然后提取索引12,...作为数组的 token ...
  • ...其元素-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

    注意:与您的问题不同,输出中包括第二个 token 中 ,后面的数字。例如 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])) }

    关于powershell - powershell:拆分输出并在选择字符串后打印,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50650997/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com