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