从Powershell

时间:2015-09-15 22:07:17

标签: arrays sorting powershell split unique

我有一组从日志中收集的字符串,我试图解析成唯一条目:

function Scan ($path, $logPaths, $pattern) 
{
$logPaths | % `
{ 
    $file = $_.FullName
    Write-Host "`n[$file]"
    Get-Content $file | Select-String -Pattern $pattern -CaseSensitive - AllMatches | % `
    {   
        $regexDateTime = New-Object System.Text.RegularExpressions.Regex "((?:\d{4})-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}(,\d{3})?)"
        $matchDate = $regexDateTime.match($_)
        if($matchDate.success)              
        {
            $loglinedate = [System.DateTime]::ParseExact($matchDate, "yyyy-MM-dd HH:mm:ss,FFF", [System.Globalization.CultureInfo]::InvariantCulture)
            if ($loglinedate -gt $laterThan)
            {                   
                $date = $($_.toString().TrimStart() -split ']')[0]
                $message = $($_.toString().TrimStart() -split ']')[1]
                $messageArr += ,$date,$message  
            }                                           
        }
    }
    $messageArr | sort $message -Unique | foreach { Write-Host -f Green $date$message}
}
}

所以对于这个输入:

2015-09-04 07:50:06 [20] WARN Core.Ports.Services.ReferenceDataCheckers.SharedCheckers.DocumentLibraryMustExistService - 无法找到DocumentLibrary 3.

2015-09-04 07:50:06 [20] WARN Core.Ports.Services.ReferenceDataCheckers.SharedCheckers.DocumentLibraryMustExistService - 无法找到DocumentLibrary 3.

2015-09-04 07:50:16 [20]警告更明亮 - 消费者已将消息abc123标记为已废弃,因为该实体在消费者方面具有更高版本。

只返回后两个条目

我在过滤掉$ message的重复内容时遇到了问题:目前正在返回所有条目(sort -Unique并不像我期望的那样)。我还需要针对过滤的$ message返回正确的$ date。

我非常坚持这一点,任何人都可以帮忙吗?

2 个答案:

答案 0 :(得分:1)

我们可以做你想做的事,但首先让我们备份一下,以帮助我们做得更好。现在你有一个数组数组,这一般很难处理。如果你有一个对象数组,那些更好的是,那些对象具有Date和Message等属性。我们从那里开始。

        if ($loglinedate -gt $laterThan)
        {                   
            $date = $($_.toString().TrimStart() -split ']')[0]
            $message = $($_.toString().TrimStart() -split ']')[1]
            $messageArr += ,$date,$message  
        }                                           

将成为......

        if ($loglinedate -gt $laterThan)
        {                   
            [Array]$messageArr += [PSCustomObject]@{
                'date' = $($_.toString().TrimStart() -split ']')[0]
                'message' = $($_.toString().TrimStart() -split ']')[1]
            }
        }                                           

生成一个对象数组,每个对象都有两个属性,Date和Message。这将更容易使用。

如果您只想要使用Group-Object命令轻松完成的任何消息的最新版本:

$FilteredArr = $messageArr | Group Message | ForEach{$_.Group|sort Date|Select -Last 1}

然后,如果你想像你一样将它显示在屏幕上,你可以这样做:

$Filtered|ForEach{Write-Host -f Green ("{0}`t{1}" -f $_.Date, $_.Message)}

答案 1 :(得分:0)

我的看法(未经测试):

 <nav class="dots">
       <a href="#" class="carousel-bullet "{{action 'goToImage' 1}}></a>
       <a href="#" class="carousel-bullet"{{action 'goToImage' 2}}></a>
       <a href="#" class="carousel-bullet"{{action 'goToImage' 3}}></a>
    </nav>

    App.SliderComponent = Ember.Component.extend({
        currentIndex: 0,

        actions: {
            runSlider: function(x){
                 var currentIndex = this.get('currentIndex');
                var indexDiff = this.$().find('.carousel ul li').index();
                var carousel = this.$().find('.carousel ul'),
                    slideWidth = carousel.find('li').width();
                    console.log(indexDiff);
                if(x == 1){
                    carousel.animate({left: - slideWidth }, 200, function () {
                        carousel.find('li:first-child').appendTo(carousel);
                        carousel.css('left', '');
                    });
                }else{
                    carousel.animate({left: + slideWidth}, 200, function () {
                        carousel.find('li:last-child').prependTo(carousel);
                        carousel.css('left', '');
                    });
                }
            }, 
            nextImage: function(){
                this.send('runSlider', 1);
            },
           previewsImage: function(){
                this.send('runSlider',0);
            },
            goToImage: function(newIndex){
                var currentIndex = this.get('currentIndex')
                var indexDiff = newIndex - currentIndex;
                var direction = (newIndex > currentIndex) ? 'nextImage' : 'previewsImage';
                for (var i = 0; i < indexDiff; i++){
                    this.send(direction);
                }
            }
        }
    });

这会在时间戳处拆分文件,并将部件加载到哈希表中,使用错误消息作为密钥,时间戳作为数据(这将在流中重复消息)。

时间戳已经采用字符串排序格式(yyyy-MM-dd HH:mm:ss),因此无需将它们转换为[datetime]以查找最新的时间戳。只需进行直接字符串比较,如果传入时间戳大于该消息的现有值,请将现有值替换为新值。

完成后,您应该有一个哈希表,其中包含找到的每条唯一邮件的密钥,其值为该邮件的最新时间戳。