2017-02-25 136 views
1

我想知道有多少用戶在最近30分鐘內使用我的代理訪問了google.com。從awk輸出中計算唯一值

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|[email protected]|200|https://google.com/ 
2017-02-19 12:10:23|[email protected]|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.

回答

1

要列出結果

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 

對於測試

# 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|[email protected]|200|https://google.com/ 
2017-02-25 23:45:23|[email protected]|200|https://google.com/ 

輸出 - 1,看導致

$ 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|[email protected]|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]++{ count++ } 
    END{ print count+0 } 
    ' f 
1 
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"