使用perl从日志文件中输出唯一的行?

时间:2013-03-08 21:24:23

标签: perl shell

在上一个问题中,我询问了如何根据正则表达式从日志文件中输出: How to use grep to output unique lines of code from a file?

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

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

我该如何实现?

2 个答案:

答案 0 :(得分:2)

这是一个Perl单行程,可以解决这个问题:

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

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

答案 1 :(得分:0)

尝试awk one-liner:

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