我想在文本文件中搜索两个字符串。仅当第一个字符串大于 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)时打印出应用程序。
提前谢谢。
带有 if 的嵌套逻辑不会像你所看到的那样工作。您需要为cpu=
后匹配的字符提供一个量词,以便在那里定义条件匹配。您也可以通过一些后期处理来衡量匹配,但这可能会带来更多麻烦,因为您还必须解决application="
匹配。
大概您的文件会在行首包含这些字符串,而它们后面没有其他内容?为了确保正确的匹配,最好使用锚点。
此外,您也可以将Export-CSV
与正确的属性一起使用Select-String
因为返回匹配对象。
$pattern = '^(cpu=.{8,}|application=".*)$'
Get-Content -Path .std_server*.out |
Select-string -Path c:temptext.txt -Pattern $pattern |
Select-Object Path,LineNumber,Line |
Export-CSV -NoTypeInformation .test.txt
cpu=.{8,}
将从字面上匹配"cpu=",然后至少必须遵循 8 个字符才能匹配。我们使用锚点来确保从比赛的开始到结束都是我们想要的,仅此而已。
你的第一句和最后一句对我来说是冲突的,但整个比赛可能是 8 个字符,所以也许你只想要数字 4。
如果他们在自己的行上,可以使用类似的东西
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
如果它们由字符分隔(在本例中为";")。