在文本文件中搜索字符串并显示,直到下一个分隔符

时间:2014-06-17 17:15:47

标签: powershell

我有一个文件" servers.txt" :

[Server1] 
Value_A 
Value_B 
Value_C

[Server2] 
Value_A

[Server3] 
Value_A 
Value_B 
Value_C 
Value_D

===

我需要搜索此文件并显示服务器行+所有值。 类似的东西:

$search = "server3" 
gc servers.txt | Select-String -Pattern $search and diplay until the next "["

(我不能告诉你,例如,显示行+ 1,因为值不同,有时只有3,有时是1等)。

非常感谢!

2 个答案:

答案 0 :(得分:3)

怎么样:

$search = "server3" 
(gc servers.txt -Delimiter '[') -like  "$search]*" -replace '^','[' -replace '\s*\[$'

更清洁的解决方案(我认为):

(gc servers.txt -raw) -split '\r\n(?=\[)' -like "?$search]*" 

答案 1 :(得分:1)

看起来您的分隔符是一个空行。如何读取文件并处理它,以便第一行是服务器名称,所有以下行直到空白是数据数组,然后在空行上它输出一个自定义对象,服务器名称和数据数组作为属性,并创建这些对象的数组?

嗯,那令人困惑,我写了。让我发布代码,然后解释它。

$Server = ""
$Data = @()
$Collection = @()
Switch(GC C:\temp\test.txt){
    {[String]::IsNullOrEmpty($Server) -and !([String]::IsNullOrWhiteSpace($_))}{$Server = $_;Continue}
    {!([String]::IsNullOrEmpty($Server)) -and !([String]::IsNullOrEmpty($_))}{$Data+=$_;Continue}
    {[String]::IsNullOrEmpty($_)}{$Collection+=[PSCustomObject]@{Server=$Server;Data=$Data};Remove-Variable Server; $Data=@()}
}
If(!([String]::IsNullOrEmpty($Server))){$Collection+=[PSCustomObject]@{Server=$Server;Data=$Data};Remove-Variable Server; $Data=@()}

好的,它首先将变量定义为空字符串或数组。

然后它处理每一行,并根据情况执行三个动作之一。交换机的第一行读取文本文件,并逐行处理。 Switch中的第一个选项基本上是:

如果$ Server变量中没有存储任何内容,且当前行不为空,则$ Server = Current Line。继续下一行。

第二个选项是:

如果$ Server不为空,且当前行不为空,请将此行添加到数组$ Data。继续下一行。

Switch的最后一个选项是:

如果当前行为空,则这是当前记录的结尾。创建具有两个属性的自定义对象。第一个属性名为Server,值为$ Server中的值。第二个属性名为Data,值为$ Data中的值。然后删除$ server变量,并将$ Data重置为空数组。

在切换之后,它检查$ Server是否仍有数据,如果有,则输出最后一个对象。我这样做是为了防止在最后一条记录的末尾没有空行,就像清理一样。

你剩下的是$ Collection是一个看起来像这样的对象数组:

Server                                             Data                                             
------                                             ----                                             
[Server1]                                          {Value_A , Value_B , Value_C}                    
[Server2]                                          {Value_A}                                        
[Server3]                                          {Value_A , Value_B , Value_C , Value_D}