옆에 있는 IP를 추출하고 싶습니다 (axyz-pc)
. 정규식을 사용하는 명령을 통해 이 작업을 수행했습니다 grep
. 하지만 awk와 sed를 통해 추출해야 합니다.
grep -Po '(?<='axyz-pc')[^:]+' logs | grep -oE '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}'| sort -nr| uniq -c |sort -nr
통나무:
2017-04-11 15:15:00 SMTP connection from (axyz-pc) [36.32.138.106]:1236 I=[10.10.19.36]:25 closed by DROP in ACL
2017-04-11 15:15:01 H=(axyz-pc) [114.225.87.41]:3823 I=[10.10.19.36]:25 rejected EHLO or HELO axyz-pc: HELO/EHLO - HELO on heloblocks Blocklist
2017-04-11 15:15:01 SMTP connection from (axyz-pc) [114.225.87.41]:3823 I=[10.10.19.36]:25 closed by DROP in ACL
2017-04-11 15:15:02 H=(axyz-pc) [36.32.138.216]:1984 I=[10.10.19.36]:25 rejected EHLO or HELO axyz-pc: HELO/EHLO - HELO on heloblocks Blocklist
2017-04-11 15:15:02 SMTP connection from (axyz-pc) [36.32.138.216]:1984 I=[10.10.19.36]:25 closed by DROP in ACL
2017-04-11 15:15:02 H=(axyz-pc) [37.49.224.14]:51593 I=[10.10.19.36]:25 rejected EHLO or HELO axyz-pc: HELO/EHLO - HELO on heloblocks Blocklist
2017-04-11 15:15:02 SMTP connection from (axyz-pc) [37.49.224.14]:51593 I=[10.10.19.36]:25 closed by DROP in ACL
2017-04-11 15:15:02 H=(axyz-pc) [36.32.138.106]:4619 I=[10.10.19.36]:25 rejected EHLO or HELO axyz-pc: HELO/EHLO - HELO on heloblocks Blocklist
출력은 다음과 같아야 합니다(중복 IP는 중복되지 않음).
36.32.138.106
114.225.87.41
36.32.138.216
37.49.224.14
답변1
왜 멈춰 있는지 잘 모르겠습니다 grep
. 더 자세히 살펴봐야 합니다. 그러나 여기서는 perlre가 필요하지 않습니다. 다음과 같은 작업이 수행됩니다(적어도 제공한 예에서는).
grep -o 'axyz-pc) \[[^]]*' | grep -o '[^[]*$'
산출:
36.32.138.106
114.225.87.41
114.225.87.41
36.32.138.216
36.32.138.216
37.49.224.14
37.49.224.14
36.32.138.106
이제 숫자로 정렬하고 적용하십시오 uniq
.
sort -t. -k1,1n -k2,2n -k3,3n -k4,4n | uniq
산출:
36.32.138.106
36.32.138.216
37.49.224.14
114.225.87.41
답변2
필요한 경우 sed
IP가 첫 번째 대괄호에 있다고 가정합니다.
sed -n '/axyz-pc/s/[^[]*\[\([0-9.]*\).*/\1/p' x|sort -nr| uniq
답변3
]
awk를 사용하고 필드가 or 로 구분되어 있다고 말하면 [
두 번째 필드만 필요합니다.
awk -F'[][]' '
{uniqoccurences[$2]++;}
END { for (i in uniqoccurences) {
print i ":" uniqoccurences[i]
}
} '
위의 예에서는 각 "$2"가 발생하는 횟수인 ":n"도 인쇄했지만 이렇게 할 필요는 없습니다(이 경우에는 print i
해당 부분에 대한 루프에서 수행하면 됩니다 END
).
정규식: 문자 클래스의 합계가 처리되는 방식으로 정규식을 사용합니다 [][]
(a 뒤의 a는 찾을 문자로 간주되고, 첫 문자 뒤(그리고 끝 앞)도 찾을 문자로 간주됩니다). 또는)]
[
[...]
]
[
[
[
]
[][]
]
[
다른 방법:
awk -F'[][]' '{ print $2 }' | sort | uniq
답변4
cat in.txt | awk '/SMTP/{print $7}'
이것을 주세요.
[36.32.138.106]:1236
[114.225.87.41]:3823
[36.32.138.216]:1984
[37.49.224.14]:51593
마지막 단계는 다음과 같습니다.
cat in.txt | awk '/SMTP/{print $7}' | sed -e 's/\[//; s/\]//; s/:...//'
편집: 위의 $7은 두 줄의 IP 주소 필드 오프셋이 다르기 때문에 작동하지 않습니다. 더 나은 접근 방식은 다음과 같습니다.
cat in.txt | awk -F "axyz-pc\) \[" '{print $2}' | awk -F"\]" '{print $1}'
첫 번째 awk에서 필드 구분자로 "axyz-pc"를 사용한 다음 출력을 두 번째 awk로 파이프합니다.
대신 sed를 사용하면 복잡하지 않습니다.