我有一个日志文件,其中日期和相应信息以字符串形式列出,格式为:
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:PathTo 715150359PM.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
}
}