`

由mongodb的维护引发的 grep,awk,sed 与管道的应用

阅读更多

首先最近想自动化实现mongodb的管理,因为现在维护mongodb每天要记录总的记录数和每天新增的记录数,无非就是两条查询语句: db.videos.count() 和 db.vid_add.count(),不过每天都要进入mongodb的shell里,执行这两条语句,接着记录日期,复制数据到一个文本文件里,每天都这样重复的操作。所以想写个脚本,在Linux下通过crontab自动维护。

 

这里用的是mongodb 1.6.4,64位,linux版

网上的mongodb的中文资料少得可怜,只能自己试。首先查询mongo命令的参数,发现有个--shell的参数,在mongodb的官网里有说明,mongodb可以通过这个参数运行js脚本,再通过官网的一个例子:https://github.com/mdirolf/shell_presentation/blob/master/slides.js,发现也不是很难。接着就在linux服务器上写了个简单的脚本,

 

mongo.js

print("all count:" + db.videos.count() );
print("add count:" + db.vid_add.count() );
 

接着在linux 试了一下:

/mongo localhost/myCollections --shell /home/bosshida/mongo.js

 

发现真的可以了:输出

MongoDB shell version: 1.6.4
connecting to: localhost/crawler
type "help" for help
all count:113358593
add count:2940633
 

不过这时是进入了mongodb 的 shell 控制台,这样就需要再写个脚本来关闭此进程

根据经验就知道是通过ps 列出全部进程,再通过grep找出进程ID, 接着kill掉

因为要去掉grep本身这个进程,又上网查了下资料,可以通过grep -v 'grep'来排除含有grep的进程,最后通过管道怎样kill掉找出的进程,脚本如下:

ps -ef| grep '/home/mongodb/bin/mongo local/myCollection --shell mongo.js' | grep -v 'grep'| awk '{print $2}' | xargs kill

 

其中awk是提取出进程号,xargs kill 是网上找来的,在man kill也没找到说明,我猜应该是对传过来的参数做为pid,接着kill掉。

 

其中对awk不熟悉,通过一些资料,大概用法也了解,主要是掌握 awk '/pattern/{action}' 这个规则,就是通过pattern找出符合的(正则),再执行action。

 

Kill掉进程后,还没完事,还要抽取数据写入文件,

 

其中要抽取的数据只是

all count:113358593
add count:2940633

 

这两行,所以我另外写一个脚本来抽取数据并写入到另外的文件

 

echo  `date`>> result.txt | sed -n '4,5p' stat.txt | awk -F : '{print $2}' >> result.txt

 

说明一下:

脚本的流程是先把日期写入result.txt文件,再通过sed把stat.txt文件的第4,5行抽取出来,通过awk抽取每行的数据追加到result.txt文件。

sed -n '4,5p' stat.txt 的意思是从文件的第4行开始到第5行,截取其内容。

awk -F : '{print $2}'的意思是以冒号":"为分隔符,打印第二个数值。

 

这样工作就大概完成了,最后写个crontab,每天定时运行脚本,就自动记录Mongodb的数据了。

 

分享到:
评论
1 楼 microwindlab 2013-05-20  
你不应该加 --shell 参数,因为 --shell run the shell after executing files

直接后面跟文件路径即可。

相关推荐

Global site tag (gtag.js) - Google Analytics