如何使用powershell在自定义日志文件上获取指定的querystring键值?

如何使用powershell在自定义日志文件上获取指定的querystring键值?,powershell,query-string,logfile,Powershell,Query String,Logfile,我试图解析自己的自定义日志文件行,除了获取一些特殊的行,这些行的头值涉及查询字符串值和包含的特殊键值 我指定了一些示例日志文件行,如下所示: 2016-01-04 14:07:06 192.168.1.0 - example.com GET MainPage a=2&b=20&c=12-10&d=apple 2016-01-04 14:07:07 192.168.1.0 - example.com GET Search x=2&y=20&c=56-32-

我试图解析自己的自定义日志文件行,除了获取一些特殊的行,这些行的头值涉及查询字符串值和包含的特殊键值

我指定了一些示例日志文件行,如下所示:

2016-01-04 14:07:06 192.168.1.0 - example.com GET MainPage a=2&b=20&c=12-10&d=apple 
2016-01-04 14:07:07 192.168.1.0 - example.com GET Search x=2&y=20&c=56-32-12&d=orange 
2016-01-04 14:07:08 192.168.1.0 - example.com GET ProdView r=1&b=20&c=24&d=orange
2016-01-04 14:09:38 192.168.1.0 - example.com GET ProdView a=2&b=20&c=1-23e&d=orange
我自己的powershell结果需要什么

2016-01-04 14:07:08 192.168.1.0 - example.com GET ProdView r=1&b=20&c=24&d=orange
输出必须显示哪些querystring参数包含c,并且它只指向数值(它不能包含任何“-”字符)

我个人的疑问如下:

Import-Csv -Encoding UTF8 .\logs\x.log -header A,B,C,D,E,F,G,H -delimiter ' ' | where {$_.H -match "c"} | select-string H
但是当我试图解析querystring参数时,我已经被阻止了


致以最诚挚的问候在您的示例中,您有双空格和三空格,但本示例仅在只有一个空格的情况下有效

Import-Csv -Encoding UTF8 .\logs\x.log -header A,B,C,D,E,F,G,H -delimiter ' ' | ? h -match 'c[^-]+(&|$)' | select -exp h
或者像这样:

gc .\logs\x.log | % {$($_ -replace ' +', ' ').trim().split(' ')[-1]} | ? {$_ -match 'c[^-]+(&|$)'}

在您的示例中,您有双空格和三空格,但此示例仅在只有一个空格的情况下有效

Import-Csv -Encoding UTF8 .\logs\x.log -header A,B,C,D,E,F,G,H -delimiter ' ' | ? h -match 'c[^-]+(&|$)' | select -exp h
或者像这样:

gc .\logs\x.log | % {$($_ -replace ' +', ' ').trim().split(' ')[-1]} | ? {$_ -match 'c[^-]+(&|$)'}

您可以使用正则表达式匹配日志条目,其中查询字符串包含您描述的信息-参数
c
存在,其值仅为数字:

$_.H -match '(^|&)c=\d+(&|$)' 

# (^|&)      either start-of-string or the character &
# c=         the literal string "c="
# \d+        one or more digits
# ($|&)      either end-of-string or the character &

您可以使用正则表达式匹配日志条目,其中查询字符串包含您描述的信息-参数
c
存在,其值仅为数字:

$_.H -match '(^|&)c=\d+(&|$)' 

# (^|&)      either start-of-string or the character &
# c=         the literal string "c="
# \d+        one or more digits
# ($|&)      either end-of-string or the character &

我在你的文件中至少计算了9列,但只有8个标题名称。当它正常工作时,你能提供一个预期结果的示例吗?你是对的,我编辑了我的文章,thanksHi@AnthonyStringer我编辑了我的文章,不是很清楚吗?我期望的行必须包含c参数,并且该参数必须仅包含数值。日志示例现在使用2和3个空格来分隔字段,实际文件是这样的吗?此外,如果您只对查询字符串感兴趣,您可能希望使用
选择对象
而不是
选择字符串
。我在您的文件中至少计算了9列,但只有8个标题名称。当这项工作正常时,您可以提供一个预期结果的示例吗?没错,我编辑了我的帖子,thanksHi@AnthonyStringer我编辑了我的帖子,不是很清楚吗?我期望的行必须包含c参数,并且该参数必须仅包含数值。日志示例现在使用2和3个空格来分隔字段,实际文件是这样的吗?此外,如果您只对查询字符串感兴趣,您可能希望使用
选择对象
而不是
选择字符串
。ı使用了您的代码,它工作了,谢谢您的帮助。ı使用了您的代码,它工作了,谢谢您的帮助。