다음과 같은 항목이 포함된 파일이 있습니다.
Feb 16 17:30:18 ns1 dovecot: pop3-login: Disconnected (auth failed, 1 attempts in 17 secs): user=<[email protected]>, method=PLAIN, rip=200.250.9.210, lip=10.10.10.10, session=<Sed519rVnADI+gnS>
이런 줄을 찾을 때마다 립 부분과 관련된 IP를 추출하고 싶은데, 최소 3번 이상 나타나는 IP를 추출하고 싶습니다.
이 작업을 수행하기 위해 grep을 사용하려고 합니다.
이게 내 grep이야
more /var/log/maillog-20130217 | grep "auth failed" | grep -o '(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4
][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)'
이 grep은 일치하는 행의 모든 IP를 표시합니다.
해당 IP와 일치하는 행이 3개 이상 있고 고유 IP만 있는 경우 IP만 표시하도록 이 grep을 어떻게 제한합니까?
내 말은 이것이다. 내 로그에 이런 내용이 있다고 가정해 보겠습니다.
Feb 16 17:30:18 ns1 dovecot: pop3-login: Disconnected (auth failed, 1 attempts in 17 secs): user=<[email protected]>, method=PLAIN, rip=200.250.9.210, lip=10.10.10.10, session=<Sed519rVnADI+gnS>
Feb 16 17:30:18 ns1 dovecot: pop3-login: Disconnected (auth failed, 1 attempts in 17 secs): user=<[email protected]>, method=PLAIN, rip=200.250.9.210, lip=10.10.10.10, session=<Sed519rVnADI+gnS>
Feb 16 17:30:18 ns1 dovecot: pop3-login: Disconnected (auth failed, 1 attempts in 17 secs): user=<[email protected]>, method=PLAIN, rip=20.20.20.20, lip=10.10.10.10, session=<Sed519rVnADI+gnS>
Feb 16 17:30:18 ns1 dovecot: pop3-login: Disconnected (auth failed, 1 attempts in 17 secs): user=<[email protected]>, method=PLAIN, rip=200.250.9.210, lip=10.10.10.10, session=<Sed519rVnADI+gnS>
이 IP를 포함하는 행이 3개 있지만 한 번만 나타나는 20.20.20.20이 아니기 때문에 grep을 수행하여 200.250.9.210을 얻고 싶습니다.
grep을 실행하면 다음과 같은 결과가 나옵니다.
200.250.9.210
200.250.9.210
20.20.20.20
200.250.9.210
즉, 일치하는 행의 모든 IP를 나열합니다.
감사해요.
답변1
sed < mail.log -n 's/.*auth failed.*rip=\([^,]*\).*/\1/p' |
sort |
uniq -c |
awk '$1 >= 3' |
sort -rn
일치하는 IP 주소와 발생 횟수(발생 기준으로 정렬)가 제공됩니다.
답변2
다음과 같이 간단할 수 있습니다.
grep "whatever" "$file" | sort | {
LAST=""
counter=0
while read -r LINE; do
if [ x"$LINE" = x"$LAST" ]; then
if [ 3 -eq "$((counter+=1))" ]; then
echo "$LINE present more that 4 times"
fi
else
counter=0
LAST="$LINE"
fi
done
}