0

我想在文本文件中搜索两个字符串。仅当第一个字符串大于 8 个字符时才会打印输出。

这是我要运行的命令:

Get-Content -Path .\std_server*.out | Select-String '((if "cpu=" -gt 8)|application=")' | out-File  -width 1024 .\test.txt

所以我想在文件 std_server*.out 中搜索 CPU 和 APPLICATION 的值,但我只想在 CPU 的值大于 8 个字符时打印这些值。

我怎么做?

目前,我有一个与'(cpu=|application=")'一起使用的基本版本,但是它会打印出 CPU 的所有值,并且我只希望在 CPU 值过高时打印出应用程序(CPU > 8)。

提前致谢。

4

2 回答 2

0

如果他们在自己的线路上可以使用类似的东西

Get-Content -Path .\std_server*.out | ?{($_.StartsWith("CPU=") -And $_.Length -gt 12) -Or $_.StartsWith("Application=")} | out-File  -width 1024 .\test.txt

或者您可以检查结束字符(例如分号),例如

Get-Content -Path .\std_server*.out | ?{(($_.StartsWith("CPU=") -And $_.Length -gt 12) -Or $_.StartsWith("Application=")) -And $_.EndsWith(";")} | out-File  -width 1024 .\test.txt

或者只是使用正则表达式,比如

Get-Content -Path .\std_server*.out | Select-String '^(cpu=\d{8,}|application=\d*)$' | out-File  -width 1024 .\test.txt

如果他们在自己的线路上,或者

Get-Content -Path .\std_server*.out | Select-String '(cpu=\d{8,}|application=\d*);' | out-File  -width 1024 .\test.txt

如果它们由字符分隔(在本例中为“;”)。

于 2016-01-28T13:24:27.120 回答
0

如您所见,带有 if 的嵌套逻辑将不起作用。您需要一个量词来匹配之后的字符,cpu=以便在那里定义条件匹配。您也可以通过一些后期处理来衡量匹配,但它可能会更令人头疼,因为您还必须解决application="匹配问题。

大概您的文件将在行首包含这些字符串,并且没有其他任何内容跟随它们?为了确保正确匹配,最好使用锚点。

您也可以使用Export-CSV正确的属性,因为Select-String返回匹配对象。

$pattern = '^(cpu=.{8,}|application=".*)$'
Get-Content -Path .\std_server*.out | 
        Select-string -Path  c:\temp\text.txt -Pattern $pattern | 
        Select-Object Path,LineNumber,Line | 
        Export-CSV -NoTypeInformation .\test.txt

cpu=.{8,}将匹配 "cpu=" 字面意思,然后至少 8 个字符必须跟随它进行匹配。我们使用锚点来确保比赛从开始到结束都是我们想要的,仅此而已。

你的第一句和最后一句对我来说是冲突的,但有可能整个匹配应该是 8 个字符,所以也许你只想要数字 4。

于 2016-01-28T13:42:20.133 回答