티스토리 뷰

전체/장난하기

습관과 성능

Coolen 2006. 8. 8. 13:44
grep mail_virus $SMTP_LOG | awk -F$ '{print $11}' | sort | uniq -c > stat.log
바이러스 로그를 추출하여 11번째 필드에 있는 것을 뽑아 통계를 내는 간단한 명령이다. 얼마나 직관적으로 사고가 발전해 나갔는지를 잘 보여주는지...
grep mail_virus $SMTP_LOG > stat.log
로그 파일에서 mail_virus가 들어있는 행을 추출한다.
grep mail_virus $SMTP_LOG | awk -F$ '{print $11}' > stat.log
그 행은 $로 필드 구별되어 있으며, 11번째에 원하는 것이 들어 있으니 그것만을 추출한다.
grep mail_virus $SMTP_LOG | awk -F$ '{print $11}' | sort > stat.log

정렬하여 같은 것끼리 붙여 놓는다.
grep mail_virus $SMTP_LOG | awk -F$ '{print $11}' | sort | uniq -c > stat.log
인접한 것들끼리 수를 세어 출력한다. 생각한번 일자로 한다. 쩝.. 그러나. 20MB되는 로그를 다 뒤지는데 25초가 걸린다. 이것, 이러면 안되는데. 문제가 뭘까 하나하나 뒤에서부터 제거하면서 다시 재어 보니, 왠걸 grep 만으로 25초가 걸렸다.

혹, 이렇게 하면?

cat $SMTP_LOG | awk -F$ '/mail_virus/ {print $11}' | sort | uniq -c > stat.log

오옷 12초, 아니 grep 정규식이 awk 정규식보다 느렸다니, 저 단순 매칭이... 정규식 엔진 문제인지, 파일읽어 들이는 문제인지 아뭏든 awk가 좀더 빠르게 처리하였다. 음... 이걸 또 한 번 줄여 볼까?

awk -F$ '/mail_virus/ {print $11}' $SMTP_LOG | sort | uniq -c > stat.log

오옷? 12초 같군. cat 만 해보니 2초안에 20MB를 모두 뱉어 낸다. 첨부터 이렇게 생각하지 못한 것은 무슨 이유일까? 점진적 사고 방식은 최적화를 거칠 필요가 반드시 생기는 것일까? 내가 하는 모든 생각이 점진적일텐데, 모든 것을 한꺼번에 사고하였다면, 다음에는 좀 더 빠른 길을 찾을 수 있지 않았을까?

20MB되는 로그였으니 이런 사고까지 이르게 되었지, 1,2MB 였다면 이런 생각하지도 않았을 것이다. 어쩌면, 위에서 cat을 쓰지 않았을 때의 차이도 더 나게될지도 모르지. awk가 pipe아닌 file이 지정되면 memory mapped I/O를 하도록 설계되었다면 더욱...
반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함