我需要解析一个文本文件并从中检索数据...基于同一文件中的其他数据..
我需要找到说不好的行...然后找到它们所在的节点。 我知道如何将数据拉入...并找到Not Ok和Nodes。我也有一个想法,我确信找到我正在寻找的东西过于复杂。我可以将Node行解析为数组,如
$test = (select-string -path C:\error.txt -Pattern "Node:").linenumber
然后找到not oks和backup lol的行号,但这似乎是最困难的方法。我熟悉PS而不是专家。
$test2 = (select-string -path C:\error.txt -Pattern "Not ok").linenumber
所以说清楚我需要的东西..
为Node解析文件..找到下面不正确的行..如果是这样,将节点设置为变量...如果不正确则找不到移动到下一个节点。
感谢您的帮助
下面的示例txt文件
Node: Server
*********************
Line 1 ok
line 2 ok
line 3 ok
Line 4 Not ok
line 5 ok
line 6 ok
*********************
Node: Server2
*********************
Line 1 ok
line 2 ok
line 3 Not ok
Line 4 ok
line 5 ok
line 6 ok
*********************
答案 0 :(得分:2)
$errorNodes = @()
Get-Content C:\temp\test.txt | ForEach-Object {
if ($_ -imatch 'Node: (.+)$') {
$node = $Matches[1]
}
if ($_ -imatch 'not ok') {
$errorNodes += $node
}
}
$errorNodes
Get-Content
逐行读取文件。$node
变量设置为当前节点的名称。$errorNodes
。所以最后,$errorNodes
将包含有问题的节点。
答案 1 :(得分:1)
如果您的列表很长,这应该是一种更快的解析方法(也减少代码:)):
$nodes = [Regex]::Split((Get-Content info.txt), 'Node:')
# '?' is an alias for Where-Object
$bad = $nodes | ? { $_.ToLower().Contains('not ok') }
$bad
现在还包含节点下的所有文字,包含" not ok" (甚至有多条线也不行)。
答案 2 :(得分:0)
这个答案很可能比它需要的更复杂,但它会返回有用的对象,这些对象取决于op在其代码中需要做什么,可以用于进一步处理。对于这个例子,我使用了OP的文件结构并添加了一些额外的节点,使输出更加冗长。
$file = Get-Content "c:\temp\test.txt" -Raw
$file -split '\s+(?=Node: \w+)' |
%{ $stringData = (($_ -replace ": "," = ") -replace 'line\W+(\d+)\W+','Line$1 = ') -replace '\*+'
New-Object PSObject -Property $(ConvertFrom-StringData $Stringdata)
} | select node,line* | Format-Table
使用PowerShell 3.0:代码将使用-Raw
参数将整个字符串读取文件(不创建字符串数组)。 $file
是在文本"节点处拆分的字符串:"这会将节点分解为单独的对象。
为了创建自定义对象,我们需要确保Node的所有项都包含name = value对。为了实现这一点,我嵌套了一些-replace
操作。
$_ -replace ": "," = "
- 将第一行更改为" Node = Servername" -replace 'line\W+(\d+)\W+','Line$1 = '
- 将Line # ok
转换为Line# = Ok\Not Ok
其中#是特定行1-6 -replace '\*+'
- 删除仅包含星号的行(或任何小号的复数)格式化字符串用作New-Object PSObject -Property $(ConvertFrom-StringData $Stringdata)
之后我们可以控制管道输出,就像几乎任何其他对象一样。确保节点首先出现在select-object
语句列表中。
以下是我的示例输出:
Node Line4 Line5 Line6 Line1 Line2 Line3
---- ----- ----- ----- ----- ----- -----
Server Not ok ok ok ok ok ok
Server2 ok ok ok ok ok Not ok
Server4 ok ok ok Not ok ok ok
Server3 ok ok ok ok ok ok