打印第三次尝试登录成功的用户名

打印第三次尝试登录成功的用户名

我有下面的日志文件,我只想打印第三次尝试成功登录的用户的名称。

cat login.log
user1:failed
user2:failed
user3:success
user1:failed
user2:failed
user4:success
user5:failed
user2:success
user3:failed
user6:success
user1:success
user3:success
user4:success
user4:success
user5:failed
user5:failed
user1:success
user2:failed

预期输出是

user1
user2

答案1

尝试

awk -F: '/failed/ { f[$1]++;} /success/ && f[$1]==2 { print ; f[$1]=0 ; }'

在哪里

  • -F:用作:分隔符
  • /failed/ { f[$1]++;}统计用户登录失败的次数
  • /success/ && f[$1]==2 { print $1; f[$1]=0 ; }根据条件打印结果。

根据注释,如果有特殊名称(为了可读性换行)

awk -F: '$2 == "failed" { f[$1]++;} 
         $2 == "success" && f[$1]==2 { print ; f[$1]=0 ; }'

答案2

简单的仅 bash 解决方案:迭代各行,为每次失败增加一个计数器,并为每次成功检查该计数器的值,如果它与所需的值匹配,则生成一些输出。sort -u最后的奖励是只输出匹配的用户,而不是每次出现。可能的增强功能是在成功时将计数器重置为 0 - 但您应该能够自己弄清楚如何做到这一点。

$ unset FAILURES  # In case you've already tried inthis shell
$ declare -A FAILURES
$ while IFS=: read USERNAME STATUS ; do [ "$STATUS" == "failed" ] && (( FAILURES[$USERNAME] += 1)); [ "$STATUS" == "success" -a "0${FAILURES[$USERNAME]}" -eq 2 ] && echo $USERNAME because status is $STATUS and failures is ${FAILURES[$USERNAME]}; done < login.log | sort -u
user1 because status is success and failures is 2
user2 because status is success and failures is 2
$

答案3

我会跟踪谁登录了,所以我们不匹配这个边缘情况:

joe:success
joe:failed
joe:failed
joe:success
awk -F: '
    $2 == "failed" {fail[$1]++} 
    $2 == "success" && !loggedin[$1] {
        if (fail[$1] == 2) print $1
        loggedin[$1] = 1
    }
' login.log

除非您对连续 2 次失败后登录的人感兴趣,无论之前是否登录过。在这种情况下你想要:

awk -F: '
    $2 == "failed" {fail[$1]++} 
    $2 == "success" {
        if (fail[$1] == 2) print $1
        fail[$1] = 0
    }
' login.log

相关内容