awk 간단 사용법

리눅스 쉘상에서 문자열을 다룰때 awk가 매우 편리하다.
대표적인 예제로, /etc/passwd 파일을 분리하는 방법이 자주 소개되곤 하는데,
다른용도로도 이용해보자.

awk -F: '{ print $1 }' /etc/passwd

가장 기본적인, passwd 파일에서 사용자 계정만 뽑아내기.
간단히 설명하자면, : 라는 구분자로, 첫번쨰 필드의 값을 나열한다.

그럼 다른 명령과 함께 조금 응용해보자.
netstat 명령으로 현재 세션을 맺고 있는 IP들을 확인한 후,
SYN_RECV 를 보내는 IP주소들만 나열해보자.
먼저 netstat -anp 를 해보면, 세션을 맺고 있는 모든 IP들이 나열된다.
나열된 목록에서, grep으로 SYN_RECV만 잡아내면 아래와 같다.

netstat -anp | grep SYN_RECV

tcp        0      0 210.57.230.4:80             222.106.132.47:3512         SYN_RECV    -
tcp        0      0 210.57.230.4:80             222.106.132.47:3246         SYN_RECV    -
tcp        0      0 210.57.230.4:80             218.148.40.223:18801        SYN_RECV    -
이런식으로 결과물이 쏟아진다.
passwd 파일과 다르게, 구분자가 공백이며, 포트번호까지 붙어있다.
이제 awk로 필요없는것들을 버리고, Source IP와 포트만 잡아보자.

netstat -anp | grep SYN_RECV | awk -F" " '{ print $5 }'
이렇게 하면, 공백으로 분리하여 다섯번째 필드의 값들만 가져오게 된다.
그러나, IP주소 되에 :으로 분리된 포트번호가 따라 붙는다.
awk를 통하여 다시한번 포트번호와 IP주소를 분리하자.
netstat -anp | grep SYN_RECV | awk -F" " '{ print $5 }' | awk -F: '{ print $1 }'

passwd 파일에서, :로 분리하여 첫번째 필드를 가져왔던것과 동일하다.
이제 어느정도 원하는 데이터들을 가져왔다.
그러나 어느 IP주소가 가장많은 연결을 가지고 있는지 알 수 없다.
uniq를 통하여 중복제거와 함께, 특정 IP가 몇개의 연결을 가지고 있는지 정리하여 보자.

netstat -anp | grep SYN_RECV | awk -F" " '{ print $5 }' | awk -F: '{ print $1 }' | sort | uniq -c
정렬과 함께, 하나의 IP가 몇개의 연결을 가지고 있는지 까지 확인하였다.
그러나, 가장 많은 연결이 하위에 오도록 보기좋게 다시한번 정렬하는것이 좋겠다.
netstat -anp | grep SYN_RECV | awk -F" " '{ print $5 }' | awk -F: '{ print $1 }' | sort | uniq -c | sort

이렇게 sort를 한번 더해주면 끝.
하지만 여기서 조금 의아하게 생각할 수 있는것이 있는데, 바로 sort를 두번 했다는것이다.
uniq -c 이후에 한번만 sort를 해줘도 될것 같지만, sort를 두번한 이유가 있다.
그 이유는 직접한번 곰곰히 생각해보시길....
이올린에 북마크하기(0) 이올린에 추천하기(0)
크리에이티브 커먼즈 라이선스
Creative Commons License
Trackback 0 Comment 0
prev 1 ... 35 36 37 38 39 40 41 42 43 ... 111 next