【问题标题】:Extract log data after particular date from log file从日志文件中提取特定日期之后的日志数据
【发布时间】:2018-01-26 12:31:45
【问题描述】:

我对 PowerShell 正则表达式有疑问。我有这个输入:

--- 新命令:20. 12. 2017 00:01:19 结束命令:20. 12. 2017 00:01:19 --- --- 新命令:20. 12. 2017 00:06:19 时间 47 毫秒。 删除 18 已创建 15 结束命令:20. 12. 2017 00:06:19 --- --- 新命令:20. 12. 2017 00:11:19 时间 47 毫秒。 结束命令:20. 12. 2017 00:11:19 --- --- 新命令:21. 12. 2017 00:16:19 时间 31 毫秒。 结束命令:21. 12. 2017 00:16:19 ---

我有以下代码,但它不起作用,你能告诉我为什么吗?

$File = Get-Content C:\Users\user\Desktop\processed.txt
$Result = $File -replace "([^/]+)End command: 20. 12. 2017 (\d+):(\d+):(\d+)","" > C:\Users\user\Desktop\processed.txt

输出只能是日期为 21. 12. 2017 及更高日期的日志。

--- 新命令:21. 12. 2017 00:16:19 时间 31 毫秒。 结束命令:21. 12. 2017 00:16:19 ---

【问题讨论】:

  • 它是怎么失败的?你得到了什么出乎你意料的结果?您采取了哪些故障排除步骤,结果如何?
  • 基本上没有任何反应,没有错误,我尝试一步一步编辑正则表达式但没有结果
  • 用文字描述你认为你的正则表达式做了什么。
  • 您的正则表达式所做的事情与您的要求完全不同。您可以使用正则表达式来做到这一点,但这并不容易。您需要一个多行正则表达式,它匹配“新命令, End 命令”以及介于两者之间的所有内容。我会用一个或多个内部正则表达式来处理循环中的行。
  • 基本上我需要从顶部捕获所有文本,直到“新命令:21. 12. 2017”。我不确定,但普通的简单正则表达式应该可以吗?

标签: regex powershell text replace


【解决方案1】:

首先我会在信息块边界处拆分日志:

$log  = Get-Content 'C:\path\to\your.log' | Out-String
$data = $log -split '(?<=---)\r?\n(?:\r?\n)+(?=---)'

然后我会检查每个单独的信息块的日期:

$ref = (Get-Date '2017-12-21').Date
$culture = [Globalization.CultureInfo]::InvariantCulture
$data | Where-Object {
    $_ -match '(?<=New command: )\d+\. \d+\. \d{4}' -and
    [DateTime]::ParseExact($matches[0], 'dd\. MM\. yyyy', $culture) -ge $ref
}

【讨论】:

  • 它有效,谢谢!现在我需要弄清楚如何替换日志文件中的结果。
【解决方案2】:

日期21. 12. 2017 及更高版本的正则表达式。

正则表达式(?:(?:2[1-9]|3[0-1])\.\s12\.\s2017|(?:\d{2}\.\s){2}(?:201[8-9]|20[2-9][0-9]|[2-9][1-9][0-9]{2}))

Regex demo

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-13
    • 1970-01-01
    • 2021-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多