Powershell 命令在文本文件中查找字符串,然后提取该行和前面的行,直到找到另一个字符串

Powershell 命令在文本文件中查找字符串,然后提取该行和前面的行,直到找到另一个字符串

我正在编写一个 powershell 脚本,用于查找离线设备并每天通过电子邮件向用户发送列表。除了一部分之外,我的大部分脚本都已完成。我将网站的内部文本输出到文本文件中,然后使用 powershell 抓取该文本文件并提取包含一定数量的特定字符串的行。文本文件的内容将采用以下格式:

区域:15NT_ 房间:Rm_42 地址:3 类型:CL41 - 问题监督:

地址:2 类型:Bed1P - 离线 监管:

地址:3 类型:Bed2 - FB 模块缺失 监管:

地址: 4 类型: PC - 离线 监管:

对于上面的文本,有两行包含字符串“OFFLINE”,这是我要查找的字符串之一。对于上面的文本,我希望脚本从包含字符串“OFFLINE”的最后一行开始提取所有前面的行,直到以字符串“Area”开头的行,然后将这些行附加到文本文件中。

编辑:这是我使用的原始代码:

$log = get-content C:\temp\RGS.txt
foreach ($line in $log) { 
if ($line -like "*Area*" -OR $line -like "*missing*" -or $line -like 
"*OFFLINE*" -or $line -like "*internal*" -or $line -like "*configuration*" - or $line -like "*unknown*") {
$line | out-file -FilePath "C:\temp\RGS Extract.txt" -Append
    }
}

此外,在源文本中,将有多行以单词“Area”开头,但在下一个“Area”之前不会在其下方列出“Adr”。我不想删除这些行,因为该区域没有包含我正在寻找的关键字之一的地址。基本上,只要一行以“Adr”开头,并且包含其中一个关键字,我就会添加该行,以及所有之前的行,包括第一次出现单词“Area”的行。

下面是我正在使用的数据源的更大样本:

Area: 7NT_ Rm: RM_11 Adr: 26 Type: CL41 - Issues Supervision: 
Adr: 2 Type: Bed1P - OFFLINE Supervision: 
Adr: 3 Type: Bed2 - FB-module missing Supervision: 
Adr: 6 Type: PCAudio Supervision: 
Adr: 7 Type: PC Supervision: 
Adr: 12 Type: PB2C Supervision: 
Adr: 15 Type: Jack2 Supervision: 
Area: 7NT_ Rm: Nourish_7116 Adr: 27 Type: CL0 Supervision: 
Adr: 4 Type: Duty Supervision: 
Area: 7NT_ Rm: Rm_09 Adr: 28 Type: CL41 - Issues Supervision: 
Adr: 2 Type: Bed1P - OFFLINE Supervision: 
Adr: 3 Type: Bed2 - FB-module missing Supervision: 
Adr: 6 Type: PCAudio Supervision: 
Adr: 7 Type: PC Supervision: 
Adr: 12 Type: PB2C Supervision: 
Adr: 15 Type: Jack2 Supervision: 
Area: 7NT_ Rm: Rm_12 Adr: 29 Type: CL41 - Issues Supervision: 
Adr: 2 Type: Bed1P - OFFLINE Supervision: 
Adr: 3 Type: Bed2 - FB-module missing Supervision: 
Adr: 6 Type: PCAudio Supervision: 
Adr: 7 Type: PC Supervision: 
Adr: 12 Type: PB2C Supervision: 
Adr: 15 Type: Jack2 Supervision: 
Area: 7NT_ Rm: Rm_07 Adr: 30 Type: CL41 - Issues Supervision: 
Adr: 2 Type: Bed1P - OFFLINE Supervision: 
Adr: 3 Type: Bed2 - FB-module missing Supervision: 
Adr: 6 Type: PCAudio Supervision: 
Adr: 7 Type: PC Supervision: 
Adr: 12 Type: PB2C Supervision: 
Adr: 15 Type: Jack2 Supervision: 
Area: 7NT_ Rm: Rm_10 Adr: 31 Type: CL41 - Issues Supervision: 
Adr: 2 Type: Bed1P - OFFLINE Supervision: 
Adr: 3 Type: Bed2 - FB-module missing Supervision: 
Adr: 6 Type: PCAudio Supervision: 
Adr: 7 Type: PC Supervision: 
Adr: 12 Type: PB2C Supervision: 
Adr: 15 Type: Jack2 Supervision: 
Area: 7NT_ Rm: Med_7108 Adr: 32 Type: CL0 Supervision: 
Adr: 4 Type: Duty Supervision: 

对于上面的代码片段,我希望 powershell 输出到文件的内容是:

Area: 7NT_ Rm: RM_11 Adr: 26 Type: CL41 - Issues Supervision: 
Adr: 2 Type: Bed1P - OFFLINE Supervision: 
Adr: 3 Type: Bed2 - FB-module missing Supervision: 

Area: 7NT_ Rm: Rm_09 Adr: 28 Type: CL41 - Issues Supervision: 
Adr: 2 Type: Bed1P - OFFLINE Supervision: 
Adr: 3 Type: Bed2 - FB-module missing Supervision: 

Area: 7NT_ Rm: Rm_12 Adr: 29 Type: CL41 - Issues Supervision: 
Adr: 2 Type: Bed1P - OFFLINE Supervision: 
Adr: 3 Type: Bed2 - FB-module missing Supervision: 

Area: 7NT_ Rm: Rm_07 Adr: 30 Type: CL41 - Issues Supervision: 
Adr: 2 Type: Bed1P - OFFLINE Supervision: 
Adr: 3 Type: Bed2 - FB-module missing Supervision: 
 
Area: 7NT_ Rm: Rm_10 Adr: 31 Type: CL41 - Issues Supervision: 
Adr: 2 Type: Bed1P - OFFLINE Supervision: 
Adr: 3 Type: Bed2 - FB-module missing Supervision:

每当以 Adr 开头的行包含我要查找的短语之一(离线、缺失、内部、配置)时,我都希望显示该行以及 Adr 行上方以 Area 开头的第一行。如果多个 Adr 行的 Area 行相同,那么我只想显示一次。

在我创建文本文件的源 HTML 文件中,Area 行始终用 h4 标记,而 Adr 行始终用 h5 标记,因此从 HTML 角度来看,如果 h5 行包含其中一个关键字,我希望将其导出到文本文件中,以及它前面的第一个 h4 行。

答案1

你可以使用这个:

((gc "filepath.txt")|select-string -pattern "^Area") >>"output.txt"
([array]::reverse((gc "filepath.txt"))|select-string -pattern ".*OFFLINE.*") >>"output.txt"

相关内容