我有一个与此相关的日志文件:
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
答案 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}