用Google AJAX Search API对互联网上Linux命令出现次数排名
本文链接:http://codingstandards.iteye.com/blog/798861 (转载请注明出处)
基本思路
最近开始编写《我使用过的Linux命令系列 》博文,忽然想到一个问题,在互联网上到底哪些Linux命令更热一些,或者介绍的文章多些。基本思路如下:
首先确定有哪些命令,为了得到尽可能全面的命令列表,我用VMWare把RHEL5.5进行了完整的安装,安装好之后利用Bash提供的命令补全功能,得到了命令列表,见附件rhel55.txt,具体做法是在Bash命令行上直接按TAB键然后不断按空白键列出所有命令。
然后得到每个命令出现的次数,开始时我做了一下尝试,在Google上手工输入了一些命令,关键字选择“linux 命令”的形式。比如adduser命令采用的关键字就是“linux adduser”,可以得到有255,000条结果,中文页面有137,000条结果。但是这样手工一条条做,显然工作量太大,因此想到了Google Search API,在其上注册了一个账号,然后编写Bash脚本测试。经过一些尝试,发现这种方式还是可行的:对每个命令进行遍历,执行Google搜索得到估计数量,输出到文件中。关于Google AJAX Search API在Linux命令行下的使用方法详见这里 。
最后将得到的命令统计数量文件进行排序,就大功告成了。
Bash脚本
Bash脚本文件 estimate.sh
#!/bin/sh # usage: google_search <STR> # Google搜索 google_search() { REF="http://codingstandards.iteye.com/" KEY="ABQIAAAAHg_ENG5Yq9pOZd19v64gyxTMcdcN4KfyGCBxustvF1FXdNe4WBQOej_ZiBgIK6-a4M3hTxcVfSkt2g" STR="$1" # 采用网页搜索 #curl -e $REF "http://ajax.googleapis.com/ajax/services/search/web?v=1.0&q=$STR&hl=zh-CN" 2>/dev/null # 采用博客搜索 #curl -e $REF "http://ajax.googleapis.com/ajax/services/search/blogs?v=1.0&q=$STR&hl=zh-CN" 2>/dev/null #curl --retry 5 -e $REF "http://ajax.googleapis.com/ajax/services/search/blogs?v=1.0&q=$STR&hl=zh-CN" 2>/dev/null curl --retry 5 -e "$REF" "http://ajax.googleapis.com/ajax/services/search/blogs?v=1.0&q=$STR&hl=zh-CN&key=$KEY" 2>/dev/null } # usage: get_estimate_count <CMD> # 得到指定命令的Google搜索结果的估计数量 get_estimate_count() { CMD=$1 # 得到google搜索的结果 #RESPONSE_DATA=$(google_search "Linux+%2B$CMD+%2B命令") RESPONSE_DATA=$(google_search "Linux+%2B\"$CMD命令\"") #echo $RESPONSE_DATA echo $RESPONSE_DATA >temp/$CMD.json # 将"estimatedResultCount":"左边的部分截掉 ESTIMATE_COUNT=${RESPONSE_DATA#*\"estimatedResultCount\":\"} #echo $ESTIMATE_COUNT # 有时候会没有结果,比如对add_jar3进行搜索时 if [ "$RESPONSE_DATA" == "$ESTIMATE_COUNT" ]; then #echo - # 不输出任何东西 return fi # 将"右边的部分截掉 ESTIMATE_COUNT=${ESTIMATE_COUNT%%\"*} #echo $ESTIMATE_COUNT echo $ESTIMATE_COUNT } #get_estimate_count add_jar3 #get_estimate_count sesearch #get_estimate_count in # usage: proc_cmd proc_cmd() { CMD=$1 NUM=$(get_estimate_count $CMD) # 发现有时候并不能得到数值,因此只有返回数值的时候才打印信息 if [ "$NUM" ]; then printf "%-36s\t%12s\n" $CMD $NUM else echo $CMD >&2 echo $CMD >>failed.dat fi } # usage: estimate_file <FILE> # 对指定文件中的命令进行Google搜索,显示成“命令 数量”的格式 estimate_file() { FILE=$1 MAX_PROCESSES=1 CUR_PROCESSES=0 for CMD in $(cat $FILE) do # 没有处理过的命令才进行搜索 if ! grep -q "$CMD " estimate.dat; then proc_cmd $CMD & CUR_PROCESSES=$[CUR_PROCESSES+1] if [ "$CUR_PROCESSES" == "$MAX_PROCESSES" ]; then wait CUR_PROCESSES=0 fi fi done if [ "$CUR_PROCESSES" != "0" ]; then wait fi } # usage: estimate_files <FILE1> <FILE2> ... # 对多个文件进行数量统计 estimate_files() { for FILE in "$@" do estimate_file $FILE done } # usage:main main() { # 对当前目录下的所有txt文件进行处理 #estimate_files ?.txt | tee estimate.dat #estimate_files "$@" | tee estimate.dat estimate_files "$@" | tee -a estimate.dat # 按照数量倒序排列 sort -k 2 -n -r estimate.dat >estimate_sorted.dat } if [ "reset" == "$1" ]; then rm -rf temp rm -f failed.dat rm -f estimate.dat estimate_sorted.dat else rm -f failed.dat mkdir -p temp #main ?.txt #main rhel55.txt main "$@" fi
使用方式:./estimate.sh <command-file>
比如:./estimate.sh rhel55.txt
这个需要很长时间运行,我是使用screen命令 来运行的。
运行结果
排在前100位的Linux命令统计数据如下
数据文件 estimate_sort.dat
for 14717552 php 3633635 POST 3500295 if 3105116 free 3077812 GET 2754997 Mail 2546814 X 2354642 c++ 2078740 install 1663794 then 1496335 look 1382716 do 1382077 red 1297329 while 1296227 r++ 1278640 ip 1159486 g++ 1090350 co 1072202 jobs 1064459 screen 1061419 case 1038589 command 1020028 complete 969708 touch 939152 times 929702 true 922490 done 881188 chat 843574 else 837265 talk 830200 patch 804871 fi 734431 spam 703822 open 703104 break 699024 until 694978 continue 687704 python 670149 groups 670066 wish 658274 HEAD 649301 star 623613 return 595490 du 595178 function 583288 clear 557484 history 553110 compare 531711 amd 519778 join 504890 cut 490316 ruby 482702 sudo 481834 firefox 448990 apt 432220 replace 431444 export 425227 pr 422921 reboot 411582 bash 409009 ar 408693 ac 408108 clock 406453 kill 399793 reset 390244 import 382678 wall 382328 crash 381835 states 361991 exit 356256 gcc 344048 newer 333310 factor 319654 column 312702 spent 301818 ci 290611 paste 286709 accept 280039 grub 275932 false 274413 arch 273525 flex 269829 flex++ 268928 sort 266867 weather 259220 ab 248634 nl 244664 chmod 226770 osx 226762 cancel 223539 fc 219973 telnet 216743 batch 215047 units 207773 yum 200619 alternatives 193568 wget 190392 emacs 190248 tux 189157
不足之处
在使用Google Search API的进行网页数量估算的时候,发现数量不太准确,比如直接使用Google搜索得到的数量与通过Google Search API得到的数量不一致,差别还蛮大。后来在Google上搜索一下,发现很多人提到了这个问题,说得到的estimatedResultCount并不准确。
还有就是,通过关键字“linux 命令”的方式得到的搜索结果中,并不是所有的页面都是来关于这个Linux命令的,比如通过"linux complete"这个关键字搜索到的主要是介绍Linux参考大全的页面。这也是美中不足的地方。后来我还尝试过使用"linux adduser命令"这种形式的关键字,或者不采用网页搜索而采用博客搜索。都无法彻底解决这个问题。
列位看官,如果您有什么好主意,请留下您的想法。