Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 使用正则表达式从文件中提取行和基于字段的行部分_Regex_Powershell_Text Parsing - Fatal编程技术网

Regex 使用正则表达式从文件中提取行和基于字段的行部分

Regex 使用正则表达式从文件中提取行和基于字段的行部分,regex,powershell,text-parsing,Regex,Powershell,Text Parsing,我需要解析此文本文件的帮助。我想得到第二行Dynamic/50,并想提取它 我还想知道是否有以服务器开头的工作站名称 如果找到一个,那么我想提取IP、工作站名称和时间/日期 我不确定解决这个问题的最佳方法是什么。 我知道我的文件不会太大,最大行数大约是70行。出于某种原因,我的Telnet输出是在每条语句之间添加空行提取完整行最方便但速度较慢的方法是使用Select字符串: 虽然Select String接受多个正则表达式,并且您甚至可以仅从选择字符串属性输出的[Microsoft.PowerS

我需要解析此文本文件的帮助。我想得到第二行Dynamic/50,并想提取它

我还想知道是否有以服务器开头的工作站名称 如果找到一个,那么我想提取IP、工作站名称和时间/日期

我不确定解决这个问题的最佳方法是什么。 我知道我的文件不会太大,最大行数大约是70行。出于某种原因,我的Telnet输出是在每条语句之间添加空行

提取完整行最方便但速度较慢的方法是使用Select字符串:

虽然Select String接受多个正则表达式,并且您甚至可以仅从选择字符串属性输出的[Microsoft.PowerShell.Commands.MatchInfo]实例的.Matches属性提取匹配的部分/捕获组,但复杂的提取需要使选择字符串变得不切实际

因此,需要自定义逻辑:

注意:以下解决方案将输入文件作为一个整体读取到内存中,这对于像您这样的小输入文件是可行的;对于较大的文件或处理命令输出,请使用基于管道的ForEach对象解决方案,该解决方案速度较慢,但内存效率较高-请参阅底部:

> (Get-Content file | Select-String -List '\bDynamic \d+/50\b').Line
Clients: Static 0/50  Dynamic 17/50
上述收益率:

客户端:静态0/50动态17/50 192.168.5.85服务器53116 09:05:14 07/20/17 等效的基于管道的解决方案:

同样,这将提高内存效率,但速度较慢。 撇开性能问题不谈,基于管道的解决方案通常更简洁,在概念上更优雅


你没有向社区提供其他人可以学习的脚本,因此我不愿意为你发布完整的答案。我会给你一个顶级的评估,如果你发布你的脚本,但仍然有问题,那么我会进一步帮助你

您的文件有3种地区内容格式。每种方法都需要不同的解析方法。我们可以称它们为顶部、中间和底部,我们可以用“Ok”文本将它们分开。我们也可以忽略底部内容区域,因为它不包含任何符合您需求的有用数据

首先获取文件的内容: $rawContent=获取内容c:\temp\yourfile.txt

现在通过“Ok”字符串将内容拆分: $contentAreas=$rawContent-拆分确定

现在,每个内容区域都可以单独使用。 $contentAreas[0]将输出顶级数据集 $contentAreas[1]将输出中间数据集

我建议您首先使用中间区域,因为它稍微容易一些。在这里,您可以使用where子句查找与服务器匹配的行。然后,您可以只解析该行中的值

接下来,您可以使用顶部区域。在这里,我建议您使用.Split通过空格、制表符和新行分隔内容。然后,您可以使用.IndexOf按名称查找字段,并从那里开始工作


同样,如果您发布的内容显示了您的努力,并提供了一些可供我使用的内容,我将很乐意进一步帮助您。

您能告诉我们输出是如何生成的吗?这是我们可以使用的另一个PowerShell脚本的结果,还是您想要解析的文件或原始命令输出的原始内容?除了Ty要求的之外……您自己是否查看过如何解析此文件?最好看看你的方法,这样我们就可以告诉你哪里出了问题,并帮助你改进。到目前为止你做了哪些尝试,取得了哪些成果?
> (Get-Content file | Select-String -List '\bDynamic \d+/50\b').Line
Clients: Static 0/50  Dynamic 17/50
# Read the entire file into an array of strings (line by line).
$lines = Get-Content file

# Extract the "Dynamic #/50" line
$lines -match '\bDynamic \d+/50\b'  # an array-valued LHS makes -match act as a filter

# Extract the server information.
foreach ($line in $lines) {
  $fields = -split $line  # split the line Awk-style into whitespace-separated fiels
  if ($fields[2] -match '^Server') { # check if 2nd fields starts with 'Server'
    $fields[1, 2, 4, 5] -join ' ' # join the fields of interest with a space and output
  }
}
Get-Content file | ForEach-Object {
  if ($_ -match '\bDynamic \d+/50') {
    $_ # output line as is
  } elseif (($fields = -split $_) -and $fields[2] -match '^Server') {
    $fields[1, 2, 4, 5] -join ' ' # output fields of interest, joined with spaces
  }
}