awk 및 sed를 통해 정보 추출

awk 및 sed를 통해 정보 추출

옆에 있는 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

필요한 경우 sedIP가 첫 번째 대괄호에 있다고 가정합니다.

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를 사용하면 복잡하지 않습니다.

관련 정보