gpt4 book ai didi

regex - 使用正则表达式过滤正则表达式结果时遇到问题

转载 作者:行者123 更新时间:2023-12-03 00:42:29 25 4
gpt4 key购买 nike

背景

我有一个脚本,该脚本在组织中的每个子网(大约200个子网,包括一些/ 16子网,总共260k个地址)上运行nmap命令,并将txt日志文件转储到一个文件夹中,每个文件夹都是一个子网。

我目前正在编写一个单独的脚本来读取每个文件夹中的txt文件,并提取我的摘要信息。

本期

输入以下内容,查看到目前为止我拥有的RegEx:

https://regex101.com/r/wUHyZm/1

目前,我使用的正则表达式可以成功匹配“设备名称(如果适用)+ IP”。

但是,这只会捕获所有设备。

输入样例:

Nmap scan report for Device1.domain.com (10.0.0.1)
Host is up (0.027s latency).
Not shown: 997 closed ports
PORT STATE SERVICE
23/tcp open telnet
79/tcp open finger
80/tcp open http

我的正则表达式目前可以抓取:
Device1.domain.com (10.0.0.1)

以及文件中的所有其他设备(IP)。

我希望只能显示设备名称+ IP,对于那些具有
23/tcp open  telnet

在他们下面

但是我不确定如何将其与正则表达式合并。

一旦弄清楚了,我将编写脚本,以便它提示用户输入“您想显示哪个端口”,因此我可以将'23','21'等分配为变量。不过我可以处理。

编辑

我只有两个单独的正则表达式语句可以解决吗?我会试一下

前(伪代码):
If (match $regexA && match $regexB) {
Code
}

最佳答案

在直接使用Ansgar Wiechers' helpful Select-String solution .NET类型的基础上,提供 [regex] 的替代方法,以加快速度:

# Sample input.
$txt = @'
Nmap scan report for Device1.domain.com (10.0.0.1)
Host is up (0.027s latency).
Not shown: 997 closed ports
PORT STATE SERVICE
23/tcp open telnet
79/tcp open finger
80/tcp open http
Nmap scan report for Device2.domain.com (10.0.0.2)
Host is up (0.027s latency).
Not shown: 997 closed ports
PORT STATE SERVICE
79/tcp open finger
80/tcp open http
Nmap scan report for Device3.domain.com (10.0.0.3)
Host is up (0.027s latency).
Not shown: 997 closed ports
PORT STATE SERVICE
23/tcp open telnet
79/tcp open finger
80/tcp open http
'@

[regex]::Matches(
$txt,
'(?m)^Nmap scan report for\s+(?<Device>.+)\r?\n(?:.+\r?\n){3}23/tcp open telnet$'
).ForEach({ $_.Groups['Device'].Value })

请注意以下假设:
  • 如果与设备相关的线块存在23/tcp open telnet行,则假定该行始终是该块中的第5行。
  • 根据您自己的评论,可以很容易地扩展解决方案以覆盖一系列后续行,例如,将regex中的{3}替换为{3,6}以覆盖第5至第8行。

  • 上面的代码产生了以下结果,表明仅匹配的那些设备在随后的第4行上跟着 23/tcp open telnet:

    Device1.domain.com (10.0.0.1)
    Device3.domain.com (10.0.0.3)

    说明:
  • [regex]::Matches($txt, '...') 将输入文本$txt与正则表达式...匹配,并返回找到的所有匹配项的集合( MatchCollection 类型)。
  • .ForEach({ $_.Groups['Device'].Value })遍历所有匹配项,提取命名捕获组Device匹配的文本(并隐式输出):
  • 每个匹配项都是一个 Match 实例,其.Groups属性包含作为 GroupCollection 实例的捕获组匹配的集合(类型 Group ),其.Value属性包含匹配的文本字符串。
  • 通常,groups集合的索引0上的条目始终存在,并且包含整个正则表达式捕获的内容。实际的捕获组匹配项可以通过位置索引(索引中第一个捕获组的1,第二个捕获组的2,...)获得,或者如果它们被命名为捕获组((?<name>...)),则可以通过该名称进行访问($_.Groups['name']),如上所示。
  • 关于regex - 使用正则表达式过滤正则表达式结果时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57676936/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com