grep을 사용하여 패턴과 일치하고 최소 X번 발생하는 항목을 표시합니다.

grep을 사용하여 패턴과 일치하고 최소 X번 발생하는 항목을 표시합니다.

다음과 같은 항목이 포함된 파일이 있습니다.

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
}

관련 정보