我希望这是一个简单的问题。
我有一个文本日志文件,其中包含以下行:
123,010502500114082000000009260000000122001T
我想搜索日志文件并返回上述文本的“00000000926”部分。所以我写了一个正则表达式: (小于?= 123 {17})。{11}
因此,当文本背后的外观等于'123'时有17个字符,返回下一个11.这在在线正则表达式编辑器上测试时效果很好。但是在Powershell中,返回整行而不是我想要的11个字符,我无法理解为什么。
$InputFile = get-content logfile.log
$regex = '(?<=123.{17}).{11}'
$Inputfile | select-string $regex
(返回整行)。
为什么powershell会返回整行?
答案 0 :(得分:5)
这是因为你正在使用Select-String
来返回匹配的行(想想grep
)。
$InputFile = get-content logfile.log | ForEach-Object {
if ($_ -match '(?<=123.{17})(.{11})') {
$Matches[1]
}
}
没有对此进行测试,但它应该有效(或类似的东西)。
答案 1 :(得分:5)
暂不打折Select-String
。就像Briantist说它正在按照你想要的那样但是你需要以两种方式之一提取实际想要的数据。 Select-String
返回Microsoft.PowerShell.Commands.MatchInfo
个对象而不仅仅是原始字符串。我们还将使用Select-String
直接获取文件输入的能力。
$InputFile = "logfile.log"
$regex = '(?<=123.{17}).{11}'
Select-string $InputFile -Pattern $regex | Select-Object -ExpandProperty Matches | Select-Object -ExpandProperty Value
如果您至少拥有PowerShell 3.0
(Select-string $InputFile -Pattern $regex).Matches.Value
在两种情况下都给出了
00000009260
答案 2 :(得分:5)
你真的不需要外观正则表达式:
$InputFile = get-content logfile.log
$InputFile -match '123.{28}' -replace '123.{17}(.{11}).+','$1'