1

在上一个问题中,我询问了如何根据正则表达式从日志文件中输出: 如何使用 grep 从文件中输出唯一的代码行?

现在我正在使用的脚本输出列表,例如:

11.12.13.14 www.mydomain.org.uk
11.12.13.16 www.mydomain.org.uk
105.2.3.1 www.myseconddomain.org.uk
105.2.3.1 myseconddomain.org.uk

我想做的是擦除共享相同 C 类 ip 的行。所以我想调整以前的输出答案:

11.12.13.14 www.mydomain.org.uk
105.2.3.1 www.myseconddomain.org.uk

我怎样才能做到这一点?

4

2 回答 2

2

这是一个可以解决问题的 Perl 单行代码:

perl -ne 'print if /^((\d+\.){3})/ and not $seen{$1}++' < logfile.txt

正则表达式/^((\d+\.){3}/匹配 IP 的前三个八位字节(或者,准确地说,三个一个或多个数字的序列,每个数字后跟一个句点,在行的开头)并将它们捕获到$1. 然后,该表达式$seen{$1}++递增哈希中的相应元素%seen(如果需要,创建它)并返回递增之前的值(因此,当且仅当该值$1之前未见过时,该值才会为假)。

于 2013-03-08T21:31:05.990 回答
0

尝试 awk 单线:

awk '!a[$1]++ && !b[$2]++' file

测试

kent$  echo "11.12.13.14 www.mydomain.org.uk
11.12.13.16 www.mydomain.org.uk
105.2.3.1 www.myseconddomain.org.uk
105.2.3.1 myseconddomain.org.uk"|awk '!a[$1]++ && !b[$2]++'
11.12.13.14 www.mydomain.org.uk
105.2.3.1 www.myseconddomain.org.uk
于 2013-03-08T21:27:49.127 回答