Powershell 从文件中每行的模式中提取文本

Powershell 从文件中每行的模式中提取文本,powershell,Powershell,我已经查看了很多答案,试图将其整合在一起,但我在使用foreach类型的语句运行时遇到了问题,而且我似乎无法将正则表达式作为一行来运行-如果它这样做的话,我尝试使用的foreach将起作用,但是正则表达式最终返回整行,而不是我需要提取的文本 以下是我目前正在使用的内容: $importPath = '.\file.LOG' $string = Get-Content $importPath $pattern = "FROM:<(.*?)> SIZE" $resul

我已经查看了很多答案,试图将其整合在一起,但我在使用foreach类型的语句运行时遇到了问题,而且我似乎无法将正则表达式作为一行来运行-如果它这样做的话,我尝试使用的foreach将起作用,但是正则表达式最终返回整行,而不是我需要提取的文本

以下是我目前正在使用的内容:

$importPath = '.\file.LOG'
$string = Get-Content $importPath
$pattern = "FROM:<(.*?)> SIZE"
$result = [regex]::match($string, $pattern).Groups[1].Value
$result
$importPath='.\file.LOG'
$string=获取内容$importPath
$pattern=“FROM:SIZE”
$result=[regex]::匹配($string,$pattern)。组[1]。值
$result
当谈到powershell时,我是一个相当普通的人,我很难理解如何从文件中的每个匹配行返回字符串


如果有一种方法可以用一个不迟钝的单行程序来实现这一点,我会更喜欢这种方法,但我可以在脚本中实现这一点,也可以通过分配变量来实现。

使用Select String来完善正则表达式

Select-String -Path .\file.LOG -Pattern 'FROM:<(.*?)> SIZE'
选择String-Path。\file.LOG-Pattern'FROM:SIZE'

(获取内容-路径。\file.LOG)-匹配“发件人:大小”
我建议使用带有
-file
-regex
选项的语句:

$result = switch -file .\file.LOG -regex { 'FROM:<(.*?)> SIZE' { $Matches[1] } }
$result=switch-file.\file.LOG-regex{'FROM:SIZE'{$Matches[1]}

它们最终都返回整行,而不是中间的字符串。我在上面发布的东西只返回它正在查找的电子邮件地址。您是否有来自的样本行项目。\file.log?2021-01-19T16:59:04.756Z,SERVERNAME\Relay,18D8BC913385E4F9,13123.123.123.123:25123.123.123.123:59946,gc.\file.log{[regex]::Match($),(?)is)MAIL from:').groups[1]。value}足够简单,这似乎可以满足我的需要。我将了解为什么switch命令适用于此。“非常感谢你听到这个消息,@wahyzcrak;我的荣幸。
switch
语句非常强大,按照PowerShell标准,它的性能很好。与
-match
一样,操作符使用
-Regex
填充@wahyzcrak,听起来可能会起作用;如果你陷入困境,我鼓励你问一个新问题。是的,PowerShell的文档在历史上一直是一个麻烦点,但自从开源以来,情况正在改善。Group-Object是我所需要的,最后,我找到了一个学习powershell的github页面,该页面链接到许多好的资源和命令备忘单,帮助我将我已经知道的bash命令等同于ps等效命令。非常有用。感谢againGlad听到它,@wahyzcrak-也许GitHub页面包含相同的链接,但不久前我在中编译了一个简短的资源列表。
$result = switch -file .\file.LOG -regex { 'FROM:<(.*?)> SIZE' { $Matches[1] } }