从awk输出中计算唯一值

时间:2017-02-25 17:57:45

标签: linux unix awk

我想知道有多少用户在过去30分钟内使用我的代理访问过google.com。

 awk -v bt=$(date "+%s" -d "30 minutes ago") '($1 > bt) && $4~/google.com/ {printf("%s|%s|%s|%s\n", strftime("%F %T",$1), $2 , $3, $4)} ' access.log

日志看起来像这样

2017-02-19 12:09:44|test@gmail.com|200|https://google.com/
2017-02-19 12:10:23|test@gmail.com|200|https://google.com/

现在我可以轻松计算记录数

 awk -v bt=$(date "+%s" -d "30 minutes ago") '($1 > bt) && $4~/google.com/ {printf("%s|%s|%s|%s\n", strftime("%F %T",$1), $2 , $3, $4)} ' access.log | wc -l

输出为2。

如何修改命令以仅显示包含唯一电子邮件的记录。在上述情况下,输出应为1.

3 个答案:

答案 0 :(得分:1)

列出结果

HTML: <p><img class="customBorder" src="http://lorempixel.com/640/480/" /></p>

CSS: img.customBorder {
  border-style: solid;
border-width: 5em;
-moz-border-image: url(http://despeaux.consulting/larryhooke/wp-content/uploads/sites/14/2017/02/imageBorder-draft1-black.png) 30 stretch;
-webkit-border-image: url(http://despeaux.consulting/larryhooke/wp-content/uploads/sites/14/2017/02/imageBorder-draft1-black.png) 30 stretch;
-o-border-image: url(http://despeaux.consulting/larryhooke/wp-content/uploads/sites/14/2017/02/imageBorder-draft1-black.png) 30 stretch;
border-image: url(http://despeaux.consulting/larryhooke/wp-content/uploads/sites/14/2017/02/imageBorder-draft1-black.png) 72 stretch;
}

获得计数

awk -v FS='|' -v bt="$(date +'%Y-%m-%d %H:%M:%S' -d '30 minutes ago')" '
    ($1 > bt) && $4~/google.com/  && !seen[$2]++
  ' access.log

进行测试

awk -v FS='|' -v bt="$(date +'%Y-%m-%d %H:%M:%S' -d '30 minutes ago')" '
    ($1 > bt) && $4~/google.com/  && !seen[$2]++{ count++ }
    END{ print count+0 }
  ' access.log

输出 - 1查看结果

# Current datetime of my system
$ date +'%Y-%m-%d %H:%M:%S'
2017-02-26 00:06:19

# 30 minutes ago what was datetime
$ date +'%Y-%m-%d %H:%M:%S' -d '30 minutes ago'
2017-02-25 23:36:20

# Input file, I modified datetime to check command
$ cat f
2017-02-25 23:10:44|test@gmail.com|200|https://google.com/
2017-02-25 23:45:23|test@gmail.com|200|https://google.com/

输出 - 2看计数

$ awk -v FS='|' -v bt="$(date +'%Y-%m-%d %H:%M:%S' -d '30 minutes ago')" '
    ($1 > bt) && $4~/google.com/  && !seen[$2]++
  ' f
2017-02-25 23:45:23|test@gmail.com|200|https://google.com/

答案 1 :(得分:0)

您可以使用sort选择唯一的电子邮件帐户。

您可以参考is-there-a-way-to-uniq-by-column

答案 2 :(得分:0)

只需将日志传送到

即可
sort -u -t "|" -k "2"

所以你会有类似的东西:

awk -v bt=$(date "+%s" -d "30 minutes ago") '($1 > bt) && $4~/google.com/ {printf("%s|%s|%s|%s\n", strftime("%F %T",$1), $2 , $3, $4)} ' access.log | sort -u -t "|" -k "2"