我有一组从日志中收集的字符串,我试图解析成唯一条目:
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。
我非常坚持这一点,任何人都可以帮忙吗?
答案 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]以查找最新的时间戳。只需进行直接字符串比较,如果传入时间戳大于该消息的现有值,请将现有值替换为新值。
完成后,您应该有一个哈希表,其中包含找到的每条唯一邮件的密钥,其值为该邮件的最新时间戳。