我正在读一个这样的文件:
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行会被修剪成一行吗?
答案 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"