我有一个文件" 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等)。
非常感谢!
答案 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}