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를 하도록 설계되었다면 더욱...
신고
  1. listen 2006.08.09 14:43 신고

    awkawrd 인가 ?
    논리적 추론의 끝에는 항상 참 또는 거짓이 있지...
    논리를 시간과 결부시키니 재미있군...
    하기야 시간을 위한 논리도 있으니까...

    • 최호진 2006.08.09 17:22 신고

      awkward (어색한, 거북한, 꼴사나운) 를 말하는 것이냐?
      awk 은..
      Aho, Weinberger, Kernighan 이라는 세 사람이 만든 유틸리티야.

  2. listen 2006.08.09 23:26 신고

    미안하다 농담 한 번 해봤다...
    내가 좀 썰렁한 농담을 좋아해서...

  3. listen 2006.08.09 23:28 신고

    Kernighan이 쓴 Software Tools in Pascal이라는 책에 보면...
    C와 UNIX에 자주 등장하는 아그들을 Pascal로 아주 깔끔하게 정리해 놓고 있는데...
    그 중에 awk 부분이 아주 재미있어...

+ Recent posts