在上一个问题中,我询问了如何根据正则表达式从日志文件中输出: 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
我该如何实现?
答案 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