Grep去除与sem相似的线条?

时间:2014-04-13 18:34:30

标签: regex linux unix

我正在读一个这样的文件:

cat access_logs | grep Ruby

确定哪些IP正在访问我的某个文件。它返回一个巨大的列表。我想删除半重复项,即这两行在技术上是相同的 - 除了具有不同的时间/日期戳。在一个包含数千个重复的大量列表中 - 有没有办法只获得唯一的IP地址?

1.2.3.4 - - [13/Apr/2014:14:20:17 -0400] "GET /color.txt HTTP/1.1" 404 207 "-" "Ruby"
1.2.3.4 - - [13/Apr/2014:14:20:38 -0400] "GET /color.txt HTTP/1.1" 404 207 "-" "Ruby"
1.2.3.4 - - [13/Apr/2014:15:20:17 -0400] "GET /color.txt HTTP/1.1" 404 207 "-" "Ruby"
1.2.3.4 - - [13/Apr/2014:15:20:38 -0400] "GET /color.txt HTTP/1.1" 404 207 "-" "Ruby"

那么例如那4行会被修剪成一行吗?

2 个答案:

答案 0 :(得分:3)

你可以这样做:

awk '/Ruby/{print $1}' file | sort -u

或者您可以使用grep + cut按照评论中的建议获取第一列。

答案 1 :(得分:2)

您可以使用awk:

awk '/Ruby/ && !seen[$1]++' access_logs

即使给定IP的时间戳不同,这也只会打印每个IP地址的第一行。

对于您的输入,它打印:

1.2.3.4 - - [13/Apr/2014:14:20:17 -0400] "GET /color.txt HTTP/1.1" 404 207 "-" "Ruby"