如何在 powershell 中的 foreach 循环之前从文本文件中提取一种模式
How to pull one pattern out of a text file before my foreach loop in powershell
我想从文件中抓取带有主机名一词的行。我正在搜索的文件是来自不同网络交换机的日志。我想从每个日志中提取主机名,然后我想 return 每个端口名,以及端口的 crc 错误。
这是代码,日志示例在代码下方。我将要从日志文件中提取出来的行加粗。
# This pulls the port numbers out of each file
[string[]]$port_counter = Select-String -Path C:\Users\tlyle\OneDrive\Documents\Log\*.txt -Pattern 'is up', 'is down'
# this pulls the crc errors out of each file
[string[]]$crc_logs = Select-String -Path C:\Users\tlyle\OneDrive\Documents\Log\*.txt -Pattern 'crc'
# Below I combine the arrays and print them out
$MaxLen = [Math]::Max($port_counter.Length, $crc_logs.Length)
$Result = @()
for ($i = 0; $i -lt $MaxLen; $i++) {
$Result += $port_counter[$i]
$Result += $crc_logs[$i]
}
$Result
这目前为我拉这个。
:GigabitEthernet1/1/1 已启动,线路协议已启动
:0 个输入错误,0 个 CRC,0 个帧,0 个被忽略
:GigabitEthernet1/1/2 已启动,线路协议已启动
0 个输入错误,0 个 CRC,0 个帧,0 个被忽略
然后对文件夹中的每个文件重复。
这是输入文件的样子 - 每个文件有 48 个端口 - GigabitEthernet1/1/1 到 1/1/48 - 我拉 2 行 输出 文件中的每个端口 - 下面以粗体显示 - 并对目录中的每个文件执行此 .. 我想在端口和 crc 信息之前拉出文件的第一行 return -- 对于每个文件 -- 这将首先显示主机名,然后是端口和crc 错误然后转到下一个文件并显示一次主机名,然后是端口和 crc 错误。 .
命令 "sh interfaces" 发送到主机“10.16.156.76”的结果:
GigabitEthernet1/1/1 up, line protocol up
端口开启 490 天 3 小时 48 分钟 56 秒
硬件是GigabitEthernet,地址是609c.9f77.2d44 (bia 609c.9f77.2d44)
配置速度auto,实际1Gbit,配置双工fdx,实际fdx
配置的 mdi 模式 AUTO,实际 MDI
EEE 功能已禁用
L2 VLAN ID 281 的成员,端口未标记,端口状态为 FORWARDING
BPDU 防护已启用,ROOT 保护已禁用,指定保护已禁用
Link 错误抑制已启用
STP 配置为 ON,优先级为 0 级,mac-学习已启用
环路检测已启用
流量控制已启用配置、启用操作、禁用协商
禁用镜像,禁用监视器
Mac-通知已禁用
不是任何活动中继的成员
不是任何已配置中继的成员
端口名称是 dev-wap
IPG MII 0 位时间,IPG GMII 0 位时间
MTU 10200 字节
300 秒输入率:21600 bits/sec、13 packets/sec、0.00% 利用率
300秒输出率:126592bits/sec、17packets/sec、0.01%利用率
1078349 个数据包输入,213724458 字节,0 无缓冲区
收到 0 个广播,3719 个多播,1074630 个单播
0 个输入错误,0 个 CRC,0 个帧,0 个忽略
0 个矮子,0 个巨人
1884404 数据包输出,2300283173 字节,0 underruns
传输了 85 个广播,138932 个多播,1745387 个单播
0 个输出错误,0 个冲突
中继代理信息选项:已禁用
UC 出口队列:
队列计数器排队的数据包丢弃的数据包
0 1733399 0
1 1381 0
2 14 0
3 6245 0
4 1194 0
5 7 0
6 105 0
7 58847 0
MC 出口队列:
队列计数器排队的数据包丢弃的数据包
0 82570 0
1 25 0
2 595 0
3 23 0
GigabitEthernet1/1/2 up, line protocol up
端口运行 473 天 9 小时 17 分钟 50 秒
硬件是GigabitEthernet,地址是609c.9f77.2d45 (bia 609c.9f77.2d45)
配置速度auto,实际1Gbit,配置双工fdx,实际fdx
配置的mdi模式AUTO,实际MDIX
EEE 功能已禁用
L2 VLAN ID 281 的成员,端口未标记,端口状态为 FORWARDING
BPDU 防护已启用,ROOT 保护已禁用,指定保护已禁用
Link 错误抑制已启用
STP 配置为 ON,优先级为 0 级,mac-学习已启用
环路检测已启用
流量控制已启用配置、启用操作、禁用协商
禁用镜像,禁用监视器
Mac-通知已禁用
不是任何活动中继的成员
不是任何已配置中继的成员
端口名称是 dev-wap
IPG MII 0 位时间,IPG GMII 0 位时间
MTU 10200 字节
300 秒输入率:4704 bits/sec, 2 packets/sec, 0.00% 利用率
300秒输出率:5320bits/sec、3packets/sec、0.00%利用率
170203 个数据包输入,37873738 字节,0 无缓冲区
收到 0 个广播,3720 个多播,166483 个单播
0 个输入错误,0 个 CRC,0 个帧,0 个忽略
0 个矮子,0 个巨人
365548 包输出,160575794 字节,0 underruns
传输 85 个广播,138931 个多播,226532 个单播
0 个输出错误,0 个冲突
中继代理信息选项:已禁用
UC 出口队列:
队列计数器排队的数据包丢弃的数据包
0 220453 0
1 83 0
2 1 0
3 641 0
4 973 0
5 3717 0
6 46 0
7 56422 0
MC 出口队列:
队列计数器排队的数据包丢弃的数据包
0 82569 0
1 25 0
2 595 0
3 23 0
这是我想要的最终结果:
主机“10.16.156.76”
:GigabitEthernet1/1/1 up, line protocol up
:0 个输入错误,0 个 CRC,0 个帧,0 个被忽略
:GigabitEthernet1/1/2 up, line protocol up
0 个输入错误,0 个 CRC,0 个帧,0 个被忽略
然后对文件夹中的每个文件重复此操作。
你太复杂了。
您应该能够使用 RegEx 匹配或 Select-String with RegEx pattern 来获取包含您要查找的文本的两行。
我刚刚复制了您的示例日志,将其另存为一个 txt 文件,然后执行了以下操作。
示例:
# Use RegEx matches to match / select the line that contains the
Get-Content -Path 'D:\Temp\Backup\RouterLog.txt' |
%{[regex]::Matches($PSItem,'^.*\b(protocol|CRC)\b.*$').Value}
# Use Select-String RegEx to match / select the line that contains the pattern
Get-Content -Path 'D:\Temp\Backup\RouterLog.txt' |
Select-String '^.*\b(protocol|CRC)\b.*$'
# Results of both is
GigabitEthernet1/1/1 is up, line protocol is up
0 input errors, 0 CRC, 0 frame, 0 ignored
GigabitEthernet1/1/2 is up, line protocol is up
0 input errors, 0 CRC, 0 frame, 0 ignored
当然,您可以像您所说的那样只对单个文件进行 ForLoop。
我想从文件中抓取带有主机名一词的行。我正在搜索的文件是来自不同网络交换机的日志。我想从每个日志中提取主机名,然后我想 return 每个端口名,以及端口的 crc 错误。
这是代码,日志示例在代码下方。我将要从日志文件中提取出来的行加粗。
# This pulls the port numbers out of each file
[string[]]$port_counter = Select-String -Path C:\Users\tlyle\OneDrive\Documents\Log\*.txt -Pattern 'is up', 'is down'
# this pulls the crc errors out of each file
[string[]]$crc_logs = Select-String -Path C:\Users\tlyle\OneDrive\Documents\Log\*.txt -Pattern 'crc'
# Below I combine the arrays and print them out
$MaxLen = [Math]::Max($port_counter.Length, $crc_logs.Length)
$Result = @()
for ($i = 0; $i -lt $MaxLen; $i++) {
$Result += $port_counter[$i]
$Result += $crc_logs[$i]
}
$Result
这目前为我拉这个。
:GigabitEthernet1/1/1 已启动,线路协议已启动
:0 个输入错误,0 个 CRC,0 个帧,0 个被忽略
:GigabitEthernet1/1/2 已启动,线路协议已启动
0 个输入错误,0 个 CRC,0 个帧,0 个被忽略
然后对文件夹中的每个文件重复。
这是输入文件的样子 - 每个文件有 48 个端口 - GigabitEthernet1/1/1 到 1/1/48 - 我拉 2 行 输出 文件中的每个端口 - 下面以粗体显示 - 并对目录中的每个文件执行此 .. 我想在端口和 crc 信息之前拉出文件的第一行 return -- 对于每个文件 -- 这将首先显示主机名,然后是端口和crc 错误然后转到下一个文件并显示一次主机名,然后是端口和 crc 错误。 .
命令 "sh interfaces" 发送到主机“10.16.156.76”的结果:
GigabitEthernet1/1/1 up, line protocol up
端口开启 490 天 3 小时 48 分钟 56 秒
硬件是GigabitEthernet,地址是609c.9f77.2d44 (bia 609c.9f77.2d44)
配置速度auto,实际1Gbit,配置双工fdx,实际fdx
配置的 mdi 模式 AUTO,实际 MDI
EEE 功能已禁用
L2 VLAN ID 281 的成员,端口未标记,端口状态为 FORWARDING
BPDU 防护已启用,ROOT 保护已禁用,指定保护已禁用
Link 错误抑制已启用
STP 配置为 ON,优先级为 0 级,mac-学习已启用
环路检测已启用
流量控制已启用配置、启用操作、禁用协商
禁用镜像,禁用监视器
Mac-通知已禁用
不是任何活动中继的成员
不是任何已配置中继的成员
端口名称是 dev-wap
IPG MII 0 位时间,IPG GMII 0 位时间
MTU 10200 字节
300 秒输入率:21600 bits/sec、13 packets/sec、0.00% 利用率
300秒输出率:126592bits/sec、17packets/sec、0.01%利用率
1078349 个数据包输入,213724458 字节,0 无缓冲区
收到 0 个广播,3719 个多播,1074630 个单播
0 个输入错误,0 个 CRC,0 个帧,0 个忽略
0 个矮子,0 个巨人
1884404 数据包输出,2300283173 字节,0 underruns
传输了 85 个广播,138932 个多播,1745387 个单播
0 个输出错误,0 个冲突
中继代理信息选项:已禁用
UC 出口队列:
队列计数器排队的数据包丢弃的数据包
0 1733399 0
1 1381 0
2 14 0
3 6245 0
4 1194 0
5 7 0
6 105 0
7 58847 0
MC 出口队列:
队列计数器排队的数据包丢弃的数据包
0 82570 0
1 25 0
2 595 0
3 23 0
GigabitEthernet1/1/2 up, line protocol up
端口运行 473 天 9 小时 17 分钟 50 秒
硬件是GigabitEthernet,地址是609c.9f77.2d45 (bia 609c.9f77.2d45)
配置速度auto,实际1Gbit,配置双工fdx,实际fdx
配置的mdi模式AUTO,实际MDIX
EEE 功能已禁用
L2 VLAN ID 281 的成员,端口未标记,端口状态为 FORWARDING
BPDU 防护已启用,ROOT 保护已禁用,指定保护已禁用
Link 错误抑制已启用
STP 配置为 ON,优先级为 0 级,mac-学习已启用
环路检测已启用
流量控制已启用配置、启用操作、禁用协商
禁用镜像,禁用监视器
Mac-通知已禁用
不是任何活动中继的成员
不是任何已配置中继的成员
端口名称是 dev-wap
IPG MII 0 位时间,IPG GMII 0 位时间
MTU 10200 字节
300 秒输入率:4704 bits/sec, 2 packets/sec, 0.00% 利用率
300秒输出率:5320bits/sec、3packets/sec、0.00%利用率
170203 个数据包输入,37873738 字节,0 无缓冲区
收到 0 个广播,3720 个多播,166483 个单播
0 个输入错误,0 个 CRC,0 个帧,0 个忽略
0 个矮子,0 个巨人
365548 包输出,160575794 字节,0 underruns
传输 85 个广播,138931 个多播,226532 个单播
0 个输出错误,0 个冲突
中继代理信息选项:已禁用
UC 出口队列:
队列计数器排队的数据包丢弃的数据包
0 220453 0
1 83 0
2 1 0
3 641 0
4 973 0
5 3717 0
6 46 0
7 56422 0
MC 出口队列:
队列计数器排队的数据包丢弃的数据包
0 82569 0
1 25 0
2 595 0
3 23 0
这是我想要的最终结果:
主机“10.16.156.76”
:GigabitEthernet1/1/1 up, line protocol up
:0 个输入错误,0 个 CRC,0 个帧,0 个被忽略
:GigabitEthernet1/1/2 up, line protocol up
0 个输入错误,0 个 CRC,0 个帧,0 个被忽略
然后对文件夹中的每个文件重复此操作。
你太复杂了。
您应该能够使用 RegEx 匹配或 Select-String with RegEx pattern 来获取包含您要查找的文本的两行。
我刚刚复制了您的示例日志,将其另存为一个 txt 文件,然后执行了以下操作。
示例:
# Use RegEx matches to match / select the line that contains the
Get-Content -Path 'D:\Temp\Backup\RouterLog.txt' |
%{[regex]::Matches($PSItem,'^.*\b(protocol|CRC)\b.*$').Value}
# Use Select-String RegEx to match / select the line that contains the pattern
Get-Content -Path 'D:\Temp\Backup\RouterLog.txt' |
Select-String '^.*\b(protocol|CRC)\b.*$'
# Results of both is
GigabitEthernet1/1/1 is up, line protocol is up
0 input errors, 0 CRC, 0 frame, 0 ignored
GigabitEthernet1/1/2 is up, line protocol is up
0 input errors, 0 CRC, 0 frame, 0 ignored
当然,您可以像您所说的那样只对单个文件进行 ForLoop。