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