【问题标题】:Extract text from pattern for each line in a file从文件中每一行的模式中提取文本
【发布时间】:2021-01-20 06:07:53
【问题描述】:

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

这是我目前使用的:

$importPath = '.\file.LOG'
$string = Get-Content $importPath
$pattern = "FROM:<(.*?)> SIZE"
$result = [regex]::match($string, $pattern).Groups[1].Value
$result

当谈到 powershell 时,我是相当普通的,并且在思考如何使它从文件中的每个匹配行返回一个字符串时遇到了麻烦。

如果有一种方法可以用一个不钝的衬里来做到这一点,我会更喜欢这种方法,但我可以在脚本中这样做或通过分配变量来做到这一点。

【问题讨论】:

    标签: powershell


    【解决方案1】:

    我建议使用带有-file-regex 选项的switch 语句:

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

    【讨论】:

    • 足够简单,这似乎可以满足我的需要。我将了解为什么 switch 命令适用于此。非常感谢
    • 很高兴听到这个消息,@wahyzcrak;我的荣幸。 switch 语句非常强大,并且按照 PowerShell 标准执行良好。与-match 一样,regular-expression matching operator 运算符使用-Regex 填充automatic $Matches variable
    • @wahyzcrak,听起来像Group-Object 可能会成功;如果您遇到困难,我鼓励您提出一个新问题。是的,PowerShell 的文档在历史上一直是个麻烦点,但自从它们开源以来,情况正在改善。
    • Group-Object 是我所需要的,我最终找到了一个 github 页面来学习 powershell,它链接到许多好的资源和命令备忘单,这些资源和命令备忘单可以帮助我将我已经知道的 bash 命令等同于ps 等价物。非常有帮助。再次感谢
    • 很高兴听到它,@wahyzcrak - 也许 GitHub 页面包含相同的链接,但不久前我在 this answer 中编译了一个简短的资源列表。
    【解决方案2】:

    使用 Select-String 完善正则表达式。

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

    (Get-Content -Path .\file.LOG) -match 'FROM:<(.*?)> SIZE'
    

    【讨论】:

    • 两者最终都返回整行而不是中间的字符串。我在上面发布的内容只返回它正在寻找的电子邮件地址。
    • 您是否有来自 .\file.log 的示例行项目?
    • 2021-01-19T16:59:04.756Z,SERVERNAME\Relay,18D8BC913385E4F9,13,123.123.123.123:25,123.123.123.123:59946, SIZE= , 作为参考,不是日志文件中的每一行都匹配,但我将所有结果输出到一个新的文本文件中,没有雪茄。
    • gc .\file.log | %{[regex]::Match($_, '(?is)MAIL FROM:').groups[1].value}
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-03
    • 2017-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多