匹配 > 11 个字符的选择字符串,并且在文件中的某个点之后开始



我想在文件(std_serverX.out(中搜索字符串cpu=的值,该值为11个字符或更多。此文件最多可以包含或超过 100 万行。

为了进一步限制搜索,我希望在找到字符串 Java 线程转储的第一个出现后开始搜索 cpu=。在我的源文件中,字符串 Java 线程转储直到大约行 # 1013169 才开始,文件的行长1057465,因此 Java 线程转储前面的 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 位小数(。 如何匹配它,以便忽略小于 11 个字符的 cpu= 的值而不打印到文件中?

这是我到目前为止所拥有的:

Get-Content -Path .std_server*.out | Select-String '(cpu=)' | out-File  -width 1024 .output.txt

我已经将我的命令简化为绝对基础,因此我不会被其他搜索要求所迷惑。

另外,我希望此命令尽可能基本,如果可能的话,它可以在Powershell中的一个命令行中运行。所以没有高级脚本或定义的变量,如果我们能避免它...... :)

这与我之前打开的一条消息有关,由于我没有准确定义我的要求,该消息变得复杂。

提前感谢您的帮助。

安托因

则表达式查找 9 位数字,后跟文字.后跟 1 位或多个数字。 全部一行

Get-Content -Path .std_server*.out | 
 Select-String -Pattern 'cpu=d{9}.d+' -AllMatches | 
  Select-Object -ExpandProperty matches  | 
    Select-Object -ExpandProperty value

这当然可以做到,但是管道一百万行,你知道的前 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

相关内容

  • 没有找到相关文章

最新更新