세 번째로 성공한 로그인 시도의 사용자 이름을 인쇄합니다.

세 번째로 성공한 로그인 시도의 사용자 이름을 인쇄합니다.

다음 로그 파일이 있는데 세 번째 시도에서 성공적으로 로그인한 사용자의 이름을 인쇄하고 싶습니다.

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

관련 정보