프로그래밍/주저리 주저리
SphinxSearch 인기 검색어 뽑아오기...
Crazy_Kong
2012. 4. 18. 18:05
1. 로그의 형식이 아래와 같을 경우.
query.log
[Wed Apr 18 17:39:25.572 2012] 0.013 sec [ext/2/ext 174 (20,20)] [*] @nickname "^닐리리맘보$" [Wed Apr 18 17:39:25.928 2012] 0.006 sec [ext/2/ext 589 (260,20)] [*] @title "막돼 1" [Wed Apr 18 17:39:26.140 2012] 0.046 sec [ext/2/ext 18289 (1020,20)] [*] @nickname "^야생마차$" [Wed Apr 18 17:39:26.517 2012] 0.025 sec [ext/2/ext 4216 (20,20)] [*] @code "ADT" @title "마담;" [Wed Apr 18 17:39:26.656 2012] 0.017 sec [ext/3/ext 85 (0,20)] [*] @code "ADT" @title "키 라라" [Wed Apr 18 17:39:26.718 2012] 0.022 sec [ext/2/ext 2608 (2540,20)] [*] @code "ADT" @title "서양" [Wed Apr 18 17:39:27.338 2012] 0.043 sec [ext/3/ext 15062 (140,20)] [*] @code "ADT" @title "노래" [Wed Apr 18 17:39:27.920 2012] 0.005 sec [ext/2/ext 207 (140,20)] [*] @title "바숨" [Wed Apr 18 17:39:27.999 2012] 0.012 sec [ext/3/ext 3 (0,20)] [*] @code "ADT" @title "롤리팝" [Wed Apr 18 17:39:28.042 2012] 0.011 sec [ext/3/ext 254 (180,20)] [*] @code "ADT" @title "max-a" |
위의 경우 @title "키워드" 를 뽑고자 한다.
2.로그를 뽑기 위해 awk 와 fgrep(grep), cat 등의 명령어를 사용하고자 한다.
cat ./query.log | awk -F '@title ' '/@title/ {print $NF}' | sort | uniq > imsi.txt
cat ./query.log | awk -F '@title ' '/@title/ {print $NF}' > imsi.txt
결과
"^닐리리맘보$" "막돼 1" "^야생마차$" "마담;"
..... "롤리팝" "max-a" |
F : 이 옵션의 경우 한 행에서 데이터를 분리하기 위한 구분자 설정을 해준다. 따로 지정하지 않았을 경우 공백으로 처리
NF : 행의 마지막 데이터. 위 같은 경우는 @title 뒤쪽의 문자들이 된다.
공백(스페이스) 로 분리가 될 경우 $15 15번째 문자열.
uniq : 이 옵션은 중복 제거
3. 다음으로 해야 할 과정은 위의 결과를 토대로 해당 키워드가 몇번이나 검색에 사용되어졌는지 확인.
while read line do tmp=`cat ./imsi.txt | fgrep "$line" | wc -l` echo "$tmp $line" >> ./result.txt done < imsi.txt
결과
3 "^닐리리맘보$" 1 "막돼 1" 4 "^야생마차$" |
문제점 : 카운트와 함께 검색키워드가 result.txt 파일에 기록이 되어 졌지만, sort 가 제대로 안되어져 있기 때문에
카운트로 정렬을 다시 한번 해주자.
cat ./result.txt | awk '{print $0}' | sort -n -r | uniq > sortResult.txt
결과
4 "^야생마차$"
3 "^닐리리맘보$" 1 "막돼 1" |
Sort 시 -n 의 옵션으로 숫자 정렬 , -r 옵션으로 reverse 해줘서 정렬을 마친다.
4. 완료된 최악의 소스
#!/bin/awk #!/bin/sh
cat /dev/null > ./imsi.txt cat /dev/null > ./result.txt cat /dev/null > ./sortResult.txt cat ./query.log | awk -F '@title ' '/@title / {print $NF}' > imsi.txt
while read line do tmp=`cat ./imsi.txt | fgrep "$line" | wc -l` echo "$tmp $line" >> ./result.txt done < imsi.txt
cat ./result.txt | awk '{print $0}' | sort -n -r | uniq > sortResult.txt
|
크론에 등록해서 돌려주기 ..
시간 으로 뽑기 애매하여 .. 전체 로그 파일을 다 읽어 왔다.. 용량이 크고 검색어가 많다면 시간이 좀 걸림..
그것이 싫다면 cat 대신에 tail -1000 이런식으로 가져와서 처리해도 무방..