我想在文本文件中搜索两个字符串。 仅当第一个字符串大于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)时。
提前致谢。
答案 0 :(得分: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
如果它们被一个角色分隔(在这种情况下是';')。
答案 1 :(得分:0)
使用if的嵌套逻辑将无法正常工作。您需要在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,}
<a data-route="test" href="#!test">test</a>
<iron-pages attr-for-selected="data-route" selected="{{route}}">
<section data-route="test">TEST</section>
</iron-pages>
将按字面意思匹配“cpu =”,然后至少8个字符必须跟随它才能进行匹配。我们使用锚来确保从开始到结束的比赛正是我们想要的,仅此而已。
你的第一句和最后一句话对我来说是冲突的,但整个比赛可能是8个字符,所以也许你只想要4号。