regex - 使用正则表达式从 .log 文件中提取数据
问题描述
我正在尝试使用 Regex positive lookbehind 提取数据。我创建了一个包含以下内容的 .ps1 文件:
$input_path = ‘input.log’
$output_file = ‘Output.txt’
$regex = ‘(?<= "name": ")(.*)(?=",)|(?<= "fullname": ")(.*)(?=",)|(?<=Start identity token validation\r\n)(.*)(?=ids: Token validation success)|(?<= "ClientName": ")(.*)(?=",\r\n "ValidateLifetime": false,)’
select-string -Path $input_path -Pattern $regex -AllMatches | % { $_.Matches } | % { $_.Value } >$output_file
输入文件如下所示:
08:15.27.47-922: T= 11 ids: Start end session request
08:15.27.47-922: T= 11 ids: Start end session request validation
08:15.27.47-922: T= 11 ids: Start identity token validation
08:15.27.47-922: T= 11 ids: Token validation success
{
"ClientId": "te_triouser",
"ClientName": "TE Trio User",
"ValidateLifetime": false,
"Claims": {
"iss": "http://sv-trio17.adm.linkoping.se:34000/core/",
"aud": "te_triouser",
"exp": "1552054900",
"nbf": "1552054600",
"nonce": "f1ae9044-25f9-4e7f-b39f-bd7bdcb9dc8d",
"iat": "1552054600",
"at_hash": "Wv_7nNe42gUP945FO4p0Wg",
"sid": "9870230d92cb741a8674313dd11ae325",
"sub": "23223",
"auth_time": "1551960154",
"idp": "tecs",
"name": "tele2",
"canLaunchAdmin": "1",
"isLockedToCustomerGroup": "0",
"customerGroupId": "1",
"fullname": "Tele2 Servicekonto Test",
"tokenIdentifier": "2Ljta5ZEovccNlab9QXb8MPXOqaBfR6eyKst/Dc4bF4=",
"tokenSequence": "bMKEXP9urPigRDUguJjvug==",
"tokenChecksum": "NINN0DDZpx7zTlxHqCb/8fLTrsyB131mWoA+7IFjGhAV303///kKRGQDuAE6irEYiCCesje2a4z47qvhEX22og==",
"idpsrv_lang": "sv-SE",
"CD_UserInfo": "23223 U2 C1",
"amr": "optional"
}
}
如果我通过http://regexstorm.net/tester运行正则表达式,我会得到正确的匹配。但是,当我在我的计算机上使用 powershell 运行我的脚本时,我没有得到我在正则表达式问题中 \r\n 的匹配项。我只从前两个正则表达式问题中得到匹配。
解决方案
- 我同意 @AdminOfThings 将 Get-Content 与
-raw
参数一起使用。 - 也不要在脚本中使用印刷引号。
- 如果前导空格的数量不是真正固定的,则用一个空格和
+
/或*
量词替换。 - 制作
\r
可选的 =>\r?
。
一个最小的完整可验证示例还应包括您的预期输出。
编辑将正则表达式更改为更好的可读性
以下脚本
## Q:\Test\2019\03\22\SO_55298614.ps1
$input_path = 'input.log'
$output_file = 'Output.txt'
$regexes = ('(?<= *"(full)?name": ")(.*)(?=",)',
'(?<=Start identity token validation\r?\n)(.*)(?=ids: Token validation success)',
'(?<= *"ClientName": ")(.*)(?=",\r?\n *"ValidateLifetime": false,)')
$regex = [RegEx]($regexes -join'|')
Get-Content $input_path -Raw | Select-String -pattern $regex -AllMatches |
ForEach-Object { $_.Matches.Value }
产生此示例输出:
> Q:\Test\2019\03\22\SO_55298614.ps1
08:15.27.47-922: T= 11
TE Trio User
tele2
Tele2 Servicekonto Test
推荐阅读
- javascript - MEAN 堆栈应用程序在从 localhost 以外的其他设备访问时不加载图像
- c++ - 在同一赋值语句中将多个字符串文字转换为 const char*
- prolog - 将整数列表拆分为序言中的子列表列表
- asp.net - ASP.NET Core 如何覆盖无效值消息
- spring-boot - 使用 Spring Boot 安排任务
- vue.js - VueJS 全局更改组件槽的内容
- arrays - Angular 7和将两个数组推入一个数组的数组给出了未定义的错误
- python - 如何为python中的每个sql查询创建单独的csv文件?
- spring - Spring Batch:读取多个json文件,一个一个处理
- c# - 在关键字后获得 2 个换行符