如何使用 powershell 仅列出最近 3 小时内创建的日志文件中的字符串?
How can I use powershell to list only the strings in a log file created in the last 3 hours?
我有一个日志文件,其中日期和相应信息以字符串形式列出,格式为:
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
此日志不断更新,但我想获取当前date/time并仅显示日志中从3 小时前到现在的信息。我需要日志中的所有信息,而不是 2015 年 7 月 14 日星期二 1:44:03 之前的任何信息(例如)。有什么方法可以获取当前 date/time 并在获取我需要的信息之前解析日志文件 3 小时?也许使用 Powershell 或某种 windows 端口的 unix 命令?目标是创建一个脚本,基本上截断日志以显示过去 3 小时的 activity,并将其输出到新日志中。我希望我已经足够清楚地说明了这一点。非常感谢任何帮助。
我在您更新 post 时更新了我的答案:
$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
条件或日期字符串条件解析为真,则它会将 $NewLogs
设置为 $true
(以使当前行之后的所有行都运行得更快),并传递线穿过管道。然后由于 $NewLogs
现在是 $true
所有超过该行的行都将通过管道。
$NewLogs = $false
Get-Content C:\Path\To\LogFile.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:\Path\To\' ([datetime]::now.tostring('MMddyyhhmmtt.\tx\t')))
所以如果我现在这样做,它会将最近 3 小时的日志保存到文件中:
C:\Path\To15150359PM.txt
使用 TheMadTechnician 的解决方案,我在 Powershell v4 上得到了关于空数组的相同错误,但是做了以下工作:
记得将日期更改为
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
}
}
我有一个日志文件,其中日期和相应信息以字符串形式列出,格式为:
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
此日志不断更新,但我想获取当前date/time并仅显示日志中从3 小时前到现在的信息。我需要日志中的所有信息,而不是 2015 年 7 月 14 日星期二 1:44:03 之前的任何信息(例如)。有什么方法可以获取当前 date/time 并在获取我需要的信息之前解析日志文件 3 小时?也许使用 Powershell 或某种 windows 端口的 unix 命令?目标是创建一个脚本,基本上截断日志以显示过去 3 小时的 activity,并将其输出到新日志中。我希望我已经足够清楚地说明了这一点。非常感谢任何帮助。
我在您更新 post 时更新了我的答案:
$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
条件或日期字符串条件解析为真,则它会将 $NewLogs
设置为 $true
(以使当前行之后的所有行都运行得更快),并传递线穿过管道。然后由于 $NewLogs
现在是 $true
所有超过该行的行都将通过管道。
$NewLogs = $false
Get-Content C:\Path\To\LogFile.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:\Path\To\' ([datetime]::now.tostring('MMddyyhhmmtt.\tx\t')))
所以如果我现在这样做,它会将最近 3 小时的日志保存到文件中:
C:\Path\To15150359PM.txt
使用 TheMadTechnician 的解决方案,我在 Powershell v4 上得到了关于空数组的相同错误,但是做了以下工作:
记得将日期更改为
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
}
}