如何使用powershell只列出在最近3小时内创建的日志文件中的字符串?



我有一个日志文件,其中日期和相应信息以字符串形式列出,格式为:

Tuesday, July 14, 2015 4:44:03 PM
Order Number 001006
Credit Card Type: AX
MessageType: 0100
Bit  2 [Primary_Account_Number..................] 3797*******1000
Bit  3 [Processing_Code.........................] 200000
Bit  4 [Amount_of_Transaction...................]     2.40
Bit 11 [Debit_Reg_E_Receipt_Number..............] 000083
Bit 14 [Expiration_Date.........................] 1704
Bit 18 [Merchant_Category_Code..................] 5812
Bit 22 [POS_Entry_Mode_PIN_Capability...........] 011
Bit 24 [Network_International_ID_NII............] 001
Bit 25 [POS_Condition_Code......................] 00
Bit 31 [Acquirer_Reference_Data.................] 2
Bit 37 [Retrieval_Reference_Number..............] 000000000283
Bit 41 [Terminal_ID.............................] 04765035
Bit 42 [Merchant_ID.............................] 000425249820993
Bit 59 [Merchant_ZIP_Postal_Code................] 19004
Tuesday, July 14, 2015 4:44:07 PM : Response:
Order Number 
Credit Card Type:   
MessageType: 0110
Bit  3 [Processing_Code.........................] 200000
Bit  4 [Amount_of_Transaction...................] 000000000240
Bit  7 [Transmission_Date_Time..................] 0714234410
Bit 11 [Debit_Reg_E_Receipt_Number..............] 000083
Bit 24 [Network_International_ID_NII............] 0001
Bit 25 [POS_Condition_Code......................] 00
Bit 37 [Retrieval_Reference_Number..............] 000000000283
Bit 39 [Response_Code...........................] 00
Bit 41 [Terminal_ID.............................] 04765035
Table 14
N                     000000000000000000000240
Table 22
APPROVAL        

此日志不断更新,但我想获得当前日期/时间,并仅显示从3小时前到现在的日志中的信息。我需要日志中的所有信息,而不是在2015年7月14日星期二1:44:03之前的任何信息(作为一个例子)。是否有一些方法,我可以得到当前的日期/时间和解析日志文件3小时之前得到我需要的信息?也许使用Powershell或某种windows端口的unix命令?目标是创建一个脚本,截断日志以显示过去3小时的活动,并将其输出到一个新日志中。我希望我说得够清楚了。如有任何帮助,不胜感激。

我在你更新你的帖子时更新了我的答案:

$path = 'C:list.txt'
$file = Get-Content $path
$i = 0
$before = (Get-Date).AddHours(-3)
foreach ($line in $file)
{
    $i++
    if ($line -match ', 2015 ')
    {
        $date = [regex]::match($line,'(?<=day, )(.*n?)(?<=M)').value | Get-Date
        if ($date -ge $before)
        {
            (Get-Content $path) | Select -Skip $($i-1)
            Break
        }
    }
}

好的,这将设置布尔变量$NewLogs$false。然后,它读取日志文件,并检查每行$NewLogs是否已设置为$true,或者是否找到日期字符串,以及该日期字符串是否小于3小时。如果$NewLogs条件或日期字符串条件中的任何一个解析为true,则将$NewLogs设置为$true(使经过当前的所有行都运行得更快),并将该行通过管道传递。然后,由于$NewLogs现在是$true,所有经过它的行都将通过管道。

$NewLogs = $false
Get-Content C:PathToLogFile.txt -ReadCount 1000 |
    ForEach{
        If($NewLogs -or ($_ -match "(S+day, w+ d{1,2}, d{4} d{1,2}:d{1,2}:d{2} w{2})" -and ([datetime]::ParseExact($Matches[1],"dddd, MMMM dd, yyyy h:mm:ss tt",$null)) -gt [datetime]::Now.AddHours(-3))){$NewLogs=$true;$_}
    }

然后您可以将其管道到Set-Content命令以输出到新文件,或者保持原样以在屏幕上显示它。如果是我,我可能会把最后一行改成:

    } | Set-Content (join-path 'C:PathTo' ([datetime]::now.tostring('MMddyyhhmmtt.txt')))

所以如果我现在这样做,它会保存最后3小时的日志到文件:

C:PathTo715150359PM.txt

我得到相同的错误关于空数组在Powershell v4与themad技术员的解决方案,但做以下工作:

记得把日期改成

Thursday, July 16, 2015 8:44:03 PM
Thursday, July 16, 2015 8:44:04 PM

更新后的脚本:

$NewLogs = $false
$file = Get-Content C:list.txt -ReadCount 1000
foreach ($line in $file)
{
    If($NewLogs -or ($line -match '(S+day, w+ d{1,2}, d{4} d{1,2}:d{1,2}:d{2} w{2})' -and ([datetime]::ParseExact($Matches[1],'dddd, MMMM dd, yyyy h:mm:ss tt',$null)) -gt [datetime]::Now.AddHours(-3)))
    {
        $NewLogs = $true
        $line
    }
}

相关内容

  • 没有找到相关文章

最新更新