`

用Google AJAX Search API对互联网上Linux命令出现次数排名

阅读更多

用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命令"这种形式的关键字,或者不采用网页搜索而采用博客搜索。都无法彻底解决这个问题。

  列位看官,如果您有什么好主意,请留下您的想法。

 

1
0
分享到:
评论
2 楼 codingstandards 2011-07-04  
superlittlefish 写道
牛,拜读了.

谢谢支持!
1 楼 superlittlefish 2011-07-02  
牛,拜读了.

相关推荐

    JAVA上百实例源码以及开源项目

    得到RSA密钥对,产生Signature对象,对用私钥对信息(info)签名,用指定算法产生签名对象,用私钥初始化签名对象,将待签名的数据传送给签名对象(须在初始化之后),用公钥验证签名结果,使用公钥初始化签名对象,用于...

    java开源包8

    利用Google:maps JSP标签库就能够在你的Web站点上实现GoogleMaps的所有功能而且不需要javascript或AJAX编程。它还能够与JSTL相结合生成数据库驱动的动态Maps。 OAuth 实现框架 Agorava Agorava 是一个实现了 OAuth ...

    java开源包1

    利用Google:maps JSP标签库就能够在你的Web站点上实现GoogleMaps的所有功能而且不需要javascript或AJAX编程。它还能够与JSTL相结合生成数据库驱动的动态Maps。 OAuth 实现框架 Agorava Agorava 是一个实现了 OAuth ...

    java开源包11

    利用Google:maps JSP标签库就能够在你的Web站点上实现GoogleMaps的所有功能而且不需要javascript或AJAX编程。它还能够与JSTL相结合生成数据库驱动的动态Maps。 OAuth 实现框架 Agorava Agorava 是一个实现了 OAuth ...

    java开源包2

    利用Google:maps JSP标签库就能够在你的Web站点上实现GoogleMaps的所有功能而且不需要javascript或AJAX编程。它还能够与JSTL相结合生成数据库驱动的动态Maps。 OAuth 实现框架 Agorava Agorava 是一个实现了 OAuth ...

    java开源包3

    利用Google:maps JSP标签库就能够在你的Web站点上实现GoogleMaps的所有功能而且不需要javascript或AJAX编程。它还能够与JSTL相结合生成数据库驱动的动态Maps。 OAuth 实现框架 Agorava Agorava 是一个实现了 OAuth ...

    java开源包6

    利用Google:maps JSP标签库就能够在你的Web站点上实现GoogleMaps的所有功能而且不需要javascript或AJAX编程。它还能够与JSTL相结合生成数据库驱动的动态Maps。 OAuth 实现框架 Agorava Agorava 是一个实现了 OAuth ...

    java开源包5

    利用Google:maps JSP标签库就能够在你的Web站点上实现GoogleMaps的所有功能而且不需要javascript或AJAX编程。它还能够与JSTL相结合生成数据库驱动的动态Maps。 OAuth 实现框架 Agorava Agorava 是一个实现了 OAuth ...

    java开源包10

    利用Google:maps JSP标签库就能够在你的Web站点上实现GoogleMaps的所有功能而且不需要javascript或AJAX编程。它还能够与JSTL相结合生成数据库驱动的动态Maps。 OAuth 实现框架 Agorava Agorava 是一个实现了 OAuth ...

    java开源包4

    利用Google:maps JSP标签库就能够在你的Web站点上实现GoogleMaps的所有功能而且不需要javascript或AJAX编程。它还能够与JSTL相结合生成数据库驱动的动态Maps。 OAuth 实现框架 Agorava Agorava 是一个实现了 OAuth ...

    java开源包7

    利用Google:maps JSP标签库就能够在你的Web站点上实现GoogleMaps的所有功能而且不需要javascript或AJAX编程。它还能够与JSTL相结合生成数据库驱动的动态Maps。 OAuth 实现框架 Agorava Agorava 是一个实现了 OAuth ...

    java开源包9

    利用Google:maps JSP标签库就能够在你的Web站点上实现GoogleMaps的所有功能而且不需要javascript或AJAX编程。它还能够与JSTL相结合生成数据库驱动的动态Maps。 OAuth 实现框架 Agorava Agorava 是一个实现了 OAuth ...

    java开源包101

    利用Google:maps JSP标签库就能够在你的Web站点上实现GoogleMaps的所有功能而且不需要javascript或AJAX编程。它还能够与JSTL相结合生成数据库驱动的动态Maps。 OAuth 实现框架 Agorava Agorava 是一个实现了 OAuth ...

    Java资源包01

    利用Google:maps JSP标签库就能够在你的Web站点上实现GoogleMaps的所有功能而且不需要javascript或AJAX编程。它还能够与JSTL相结合生成数据库驱动的动态Maps。 OAuth 实现框架 Agorava Agorava 是一个实现了 OAuth ...

    JAVA上百实例源码以及开源项目源代码

    得到RSA密钥对,产生Signature对象,对用私钥对信息(info)签名,用指定算法产生签名对象,用私钥初始化签名对象,将待签名的数据传送给签名对象(须在初始化之后),用公钥验证签名结果,使用公钥初始化签名对象,用于...

Global site tag (gtag.js) - Google Analytics