分割日志文件

时间:2018-11-06 10:35:16

标签: powershell

我有一个与此相关的日志文件:

Wed Oct 17 05:39:27 2018 : Resource = 'test04' cstep= 'titi04' time =18.751s 
Wed Oct 17 05:40:31 2018 : Resource = 'test05' cstep= 'titi05' time =58.407s 
Wed Oct 17 05:41:31 2018 : Resource = 'test06' cstep= 'titi06' time =3.400s 
Wed Oct 17 05:42:31 2018 : Resource = 'test07' cstep= 'titi07' time =4.402s 

我要拆分,并且只想要大于5的值:

18.751
58.407

我的脚本在PowerShell中,并且收集所有值,而不仅仅是大于5的值:

$list = Get-Content "C:\Users\Desktop\slow_trans\log_file.txt"

$results = foreach ($line in $list) {
    $line.Split('=')[3].Trim().TrimEnd('s')
}

$results

结果是

18.751 
58.407 
3.400
4.402

我只想要

3.400
4.402

3 个答案:

答案 0 :(得分:1)

动态更改要求通常是不可行的, 所以你不值得。
另外,Superior 5一词使我想起了另一个用户帐户的上一个问题。

尽管如此,这里的脚本只有一个管道和日期时间转换。

## Q:\Test\2018\11\06\SO_53170145.ps1
Get-Content .\logfile.txt |
  Where-Object {$_ -match '^(.*?) : .*time =([0-9\.]+)s'}|
    Select-Object @{n='DT';e={([datetime]::ParseExact($Matches[1],'ddd MMM dd HH:mm:ss yyyy',[cultureinfo]::InvariantCulture).ToString('yyyy-MM-dd HH:mm:ss'))}},
                  @{n='val';e={[double]$Matches[2]}} |
      Where-Object val -le 5

示例输出(由于我的德语区域设置而导致的小数逗号)

DT                    val
--                    ---
2018-10-17 05:41:31   3,4
2018-10-17 05:42:31 4,402

答案 1 :(得分:0)

以下内容将选定的字符串转换为双精度字符串,然后仅返回小于5的那些字符串。

List<MyObjectINotifyImplemented>

答案 2 :(得分:0)

Select-String是一种选择:

(Select-String -Path "TargetLog.txt" -Pattern ".*(?<time>\d+\.\d+)s").Matches |
    ForEach-Object {
        if([double]$_.Groups['time'].Value -lt 5.0) {$_.Value}
    }

这将输出整个匹配行:

Wed Oct 17 05:41:31 2018 : Resource = 'test06' cstep= 'titi06' time =3.400s
Wed Oct 17 05:42:31 2018 : Resource = 'test07' cstep= 'titi07' time =4.402s

如果您只想从每一行中获取数字,请将if块更改为此:

{$_.Groups['time'].Value}