首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >提取与正则表达式匹配的文件中的所有行

提取与正则表达式匹配的文件中的所有行
EN

Stack Overflow用户
提问于 2020-05-12 07:50:37
回答 1查看 78关注 0票数 0

我有一个50k行文件,其中包含dig命令输出;我希望提取所有符合所有IPv4专用网络类(RFC1918)正则表达式的行。下面提供了一个示例,提供了用于演示的模拟值:

主输入文件:

代码语言:javascript
代码运行次数:0
运行
复制
; <<>> DiG 9.10.6 <<>> google.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 19663
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;google.com.            IN  A

;; ANSWER SECTION:
google.com.     135 IN  A   192.168.0.1

;; Query time: 38 msec
;; SERVER: 192.168.0.1#53(192.168.0.1)
;; WHEN: Tue May 12 17:40:16 AEST 2020
;; MSG SIZE  rcvd: 55

; <<>> DiG 9.10.6 <<>> transfer.me
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 7906
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;transfer.me.           IN  A

;; ANSWER SECTION:
transfer.me.        7200    IN  A   10.216.41.127

;; Query time: 588 msec
;; SERVER: 192.168.0.1#53(192.168.0.1)
;; WHEN: Tue May 12 17:40:36 AEST 2020
;; MSG SIZE  rcvd: 56

期望的产出:

代码语言:javascript
代码运行次数:0
运行
复制
google.com.     135 IN  A   192.168.0.1
transfer.me.        7200    IN  A   10.216.41.127

我已经有了正则表达式,所以这只是一个如何把它们放在一起以获得所需输出的问题。

A类网络:

代码语言:javascript
代码运行次数:0
运行
复制
(10)(\.([2]([0-5][0-5]|[01234][6-9])|[1][0-9][0-9]|[1-9][0-9]|[0-9])){3}

B类网络:

代码语言:javascript
代码运行次数:0
运行
复制
(172)\.(1[6-9]|2[0-9]|3[0-1])(\.(2[0-4][0-9]|25[0-5]|[1][0-9][0-9]|[1-9][0-9]|[0-9])){2}

C类网络:

代码语言:javascript
代码运行次数:0
运行
复制
(192)\.(168)(\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])){2}

希望获得UNIX CLI实用程序、甚至更好的Python或Perl脚本的帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-12 08:08:25

这个问题没什么特别的。

您已经为每个网络类定义了regex,让我们将其用于

代码语言:javascript
代码运行次数:0
运行
复制
use strict;
use warnings;
use feature 'say';

my $re_classA = qr/(10)(\.([2]([0-5][0-5]|[01234][6-9])|[1][0-9][0-9]|[1-9][0-9]|[0-9])){3}/;
my $re_classB = qr/(172)\.(1[6-9]|2[0-9]|3[0-1])(\.(2[0-4][0-9]|25[0-5]|[1][0-9][0-9]|[1-9][0-9]|[0-9])){2}/;
my $re_classC = qr/(192)\.(168)(\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])){2}/;

while(<DATA>) {
    chomp;
    next if /^;/;
    say if /$re_classA/;
    say if /$re_classB/;
    say if /$re_classC/;
}

__DATA__

; <<>> DiG 9.10.6 <<>> google.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 19663
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;google.com.            IN  A

;; ANSWER SECTION:
google.com.     135 IN  A   192.168.0.1

;; Query time: 38 msec
;; SERVER: 192.168.0.1#53(192.168.0.1)
;; WHEN: Tue May 12 17:40:16 AEST 2020
;; MSG SIZE  rcvd: 55

; <<>> DiG 9.10.6 <<>> transfer.me
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 7906
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;transfer.me.           IN  A

;; ANSWER SECTION:
transfer.me.        7200    IN  A   10.216.41.127

;; Query time: 588 msec
;; SERVER: 192.168.0.1#53(192.168.0.1)
;; WHEN: Tue May 12 17:40:36 AEST 2020
;; MSG SIZE  rcvd: 56

输出

代码语言:javascript
代码运行次数:0
运行
复制
google.com.     135 IN  A   192.168.0.1
transfer.me.        7200    IN  A   10.216.41.127
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61746423

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档