파일에서 3개의 특정 내용을 검색하는 방법은 무엇입니까?

파일에서 3개의 특정 내용을 검색하는 방법은 무엇입니까?

이 파일에서 security.logDNSBL 5 순위가 가장 높은 IP 주소가 몇 개인지 확인해야 합니다. 파일의 한 줄은 다음과 같습니다.

Oct 24 00:00:28 MAIL-00 postfix/postscreen[10909]: dnsbl rank 5 for [103.129.47.51]:50807

DNSBL 순위를 사용하여 IP 주소를 필터링하기 위해 다음을 수행했습니다.

grep "ip" security.log | grep -i "DNSBL" security.log

아니면 도움이 되는 쉘 스크립트를 작성할 수도 있습니다. 다음과 같은 것을 생각하고 있습니다.

#!/bin/bash

#grep every ip with "dnsbl rank 5"
#count the amount of times each unique one appears, create variable with IP and value is the number of times it appears
#Find the variable with the biggest value and output the variable name to screen

스크립트는 다른 콘텐츠를 제거해야 하므로 검색할 출력은 이전에 "dnsbl ran 5"가 있었던 IP 목록일 뿐입니다. 저는 cut이것을 오랫동안 사용하지 않았습니다. 이것이 괄호 안에 IP만 얻는 가장 좋은 방법입니까?

누구든지 나를 도울 수 있다면 매우 감사하겠습니다!

답변1

행이 표시 중인 행과 항상 유사한 경우 다음을 수행할 수 있습니다.

sed -nE 's/.*dnsbl rank 5.*\[([0-9\.]+)\].*/\1/pi' test.log | sort | uniq -c | sort -nr | head -n 1

sed 명령은 "dnsblrank 5"가 포함된 행만 인쇄하지만 해당 문구 뒤의 괄호 쌍에 있는 항목을 제외한 모든 항목을 제거합니다. 그런 다음 첫 번째 sort 명령은 일치하는 항목을 모두 모으고 uniq 명령은 일치하는 항목 수를 계산합니다. 일치하는 항목 수 ip , 두 번째 정렬은 순서대로 정렬하고 head 명령은 첫 번째 1을 사용합니다.

출력은 다음과 유사해야 합니다. 4 103.129.47.51 dnsbl 순위 5의 IP 주소가 다른 것보다 더 많이 4번 나타나는 경우.

그러나 이것이 실제로 관계를 설명하는 것은 아니며 데이터는 일관된 형식이어야 합니다.

답변2

awk '/dnsbl rank 5/{for(i=1;i<=NF;i++){if ($i ~ /[0-9]{1,}\.[0-9]{1,}\.[0-9]{1,}\.[0-9]{1,}/){gsub(/\].*/,"",$i);gsub(/\[/,"",$i);print $i}}}' filename| awk '{a[$1]++}END{for(x in a){print x,a[x]}}'| sort -k2 -nr

이것이 도움이 될 수 있습니다

관련 정보