我有一个日志文件,我想在一行中提取用户名,其中显示的是ERROR 5.
示例:
2018/04/13 10:48:04 ERROR 5 (0x00000005) Copying File \\myserver\shares\johnsmith\My Documents\examplefile.txt
我想找到字符串“johnsmith”并将其放入一个新的文本文件中。 我的想法是搜索ERROR 5,然后在第四个和第五个“\” - 字母之间找到字符串。
我在谷歌搜索时发现了这个:
(get-content C:\temp\testlog.txt) | % {
if ($_ -match "ERROR 5 (0x00000005) Copying File \\myserver\shares\ (.*)") {
$name = $matches[1]
echo $name
}
}
但实际上并不奏效。
任何人都可以给我任何线索使用哪些功能?
答案 0 :(得分:2)
假设文件路径始终如上所述,这应该为您提供在日志文件中找到的任何匹配行的名称,文件和错误代码:
Get-Content C:\temp\testlog.txt |
ForEach-Object {
if ($_ -match "^.*ERROR (?<ErrorCode>(\d+)) \(0x\d+\) Copying File \\\\myserver\\shares\\(?<UserName>\w+)\\My Documents\\(?<FileName>.*)$")
{
[PsCustomObject]@{
UserName = $matches.UserName;
FileName = $matches.FileName;
ErrorCode = $matches.ErrorCode
}
}
}
输出如下:
UserName FileName ErrorCode
-------- -------- ---------
johnsmith examplefile.txt 5
marysmith examplefile.txt 5
adamsmith examplefile.txt 5
philsmith examplefile.txt 5
要仅捕获要归档的用户名,请将代码修改为:
Get-Content .\testlog.txt |
ForEach-Object {
if ($_ -match "^.*ERROR (?<ErrorCode>(\d+)) \(0x\d+\) Copying File \\\\myserver\\shares\\(?<UserName>\w+)\\.*$")
{
$matches.UserName
}
} | Out-File .\UserNames.txt