过滤由日期时间字段分隔的多行

时间:2016-06-08 21:22:46

标签: python powershell

我有一个由日期时间字段分隔的多行日志文件,如下所示:

2016-06-06 07:26:46,038: sometext...
sometext...
  sometext...
sometext...
2016-06-06 08:21:46,591:sometext1234...This is what I want...
sometext...abcd1234
2016-06-06 09:06:47,003: sometext...
2016-06-06 09:16:46,957: sometext...
  sometext...
 sometext...

日期时间始终从行的开头开始,但文本可以在同一行或跨越多行。是否有一种简单的方法可以使用" sometext"来分组和过滤日期时间。在PowerShell(或python)?提前谢谢!

PS: 为了清楚起见,我想从上面过滤出来:

2016-06-06 08:21:46,591:sometext1234...This is what I want...
sometext...abcd1234

通过提供文本"这就是我想要的"

2 个答案:

答案 0 :(得分:0)

PowerShell ConvertFrom-String可以获取模板并将数据转换为结构输出。 您可能需要调整实际数据的模板。

实施例

$log = @"
2016-06-06 07:26:46,038: sometext...
sometext...
  sometext...
sometext...
2016-06-06 08:21:46,591:sometext1234...This is what I want...
sometext...abcd1234
2016-06-06 09:06:47,003: sometext...
2016-06-06 09:16:46,957: sometext...
  sometext...
 sometext...
"@

$logTemplate = @"
{log*:{date:2016-06-06 07:26:46,038:}{message:sometext...}}
"@

$log | ConvertFrom-String -TemplateContent $logTemplate

结果

log                                                                              
---                                                                              
{@{date=2016-06-06 07:26:46,038:; message= sometext...}}                         
sometext...                                                                      
  sometext...                                                                    
sometext...                                                                      
{@{date=2016-06-06 08:21:46,591:; message=sometext1234...This is what I want...}}
sometext...abcd1234                                                              
{@{date=2016-06-06 09:06:47,003:; message= sometext...}}                         
{@{date=2016-06-06 09:16:46,957:; message= sometext...}}                         
  sometext...      

答案 1 :(得分:0)

抱歉,我花了一段时间,但我终于明白了。非常感谢每个人,他给了我测试的想法。即使@TravisEz13的convertfrom-string几乎是我想要的,我确实在其他应用程序中使用它,非常有用,但我并没有在这种情况下使用它。我最后用get-content读取文件,但是在select-string有一个选项-context之前我还不知道。所以我在非常大(有点作弊)之后设置了线条,并且它起作用了。这是代码:

  

gc" C:\ abc.txt" | select-string' \ d {4} - \ d {2} - \ d {2} \ d {2}:\ d {2}:\ d {2}' - 上下文0,100 | ?{$ _ -match"无论如何"}