我想在文件(std_serverX.out)中搜索11个字符或更大字符串 cpu = 的值。此文件可包含最多或超过1百万行的任何地方。
为了进一步限制搜索,我希望在第一次出现字符串 Java Thread Dump 后,搜索 cpu = 。 在我的源文件中,字符串 Java Thread Dump 直到大约 1013169 的行 1057465 行才开始,所以因此 Java Thread Dump 之前的96%是不必要的..
以下是我要搜索的文件的一部分:
cpu=191362359.38 [reset 191362359.38] ms elapsed=1288865.05 [reset 1288865.05] s allocated=86688238148864 B (78.84 TB) [reset 86688238148864 B (78.84 TB)] defined_classes=468
io= file i/o: 588014/275091 B, net i/o: 36449/41265 B, files opened:19, socks opened:0 [reset file i/o: 588014/275091 B, net i/o: 36449/41265 B, files opened:19, socks opened:0 ]
user="Guest" application="JavaEE/ResetPassword" tid=0x0000000047a8b000 nid=0x1b10 / 6928 runnable [_thread_blocked (_call_back), stack(0x0000000070de0000,0x0000000070fe0000)] [0x0000000070fdd000] java.lang.Thread.State: RUNNABLE
在上面,你可以看到cpu = 191362359.38 是12个字符长(包括句号和2个小数位)。如何匹配它以便忽略 cpu = 小于11个字符的值而不打印到文件?
这是我到目前为止所做的:
Get-Content -Path .\std_server*.out | Select-String '(cpu=)' | out-File -width 1024 .\output.txt
我已将我的命令剥离到绝对基础,所以我不会对其他搜索要求感到困惑。
另外,我希望这个命令尽可能基本,如果可能的话,它可以在Powershell中的一个命令行中运行。所以没有高级脚本或定义的变量,如果我们可以避免它......:)
这与我打开的 previous message 相关,由于我没有明确定义我的要求而变得复杂。
提前感谢您的帮助。
Antóin
答案 0 :(得分:0)
正则表达式查找9位数后跟一个文字.
后跟一个或多个数字。所有一行
Get-Content -Path .\std_server*.out |
Select-String -Pattern 'cpu=\d{9}\.\d+' -AllMatches |
Select-Object -ExpandProperty matches |
Select-Object -ExpandProperty value
答案 1 :(得分:0)
当然可以做到,但是管道一百万行,你知道的第一个96%没有相关性,不会非常快/有效。
更快的方法是使用StreamReader
并跳过这些行,直到找到Java Thread Dump
字符串:
$CPULines = @()
foreach($file in Get-Item .\std_server*.out)
{
# Create stream reader from file
$Reader = New-Object -TypeName 'System.IO.StreamReader' -ArgumentList $file.FullName
$JTDFound = $false
# Read file line by line
while(($line = $Reader.ReadLine()))
{
# Keep looking until 'Java Thread Dump' is found
if(-not $JTDFound)
{
$JTDFound = $line.Contains('Java Thread Dump')
}
else
{
# Then, if a value matching your description is found, add that line to our results
if($line -match '^cpu=([\d\.]{11,})\s')
{
$CPULines += $line
}
}
}
# dispose of the stream reader
$Reader.Dispose()
}
# Write output to file
$CPULines |Out-File .\output.txt