红联Linux门户
Linux帮助

Shell, Sqlite,date和awk

发布时间:2007-02-24 01:03:39来源:红联作者:莫奕
  上周写了有生以来最复杂的Shell程序,这个程序的目的是从一个文本文件生成各种统计信息。文本文件有1000多行,每行对应一条记录,每条记录有10来个域。统计的信息很多,比如一个长时间段内,某个域发生某种变化的记录总数的变化趋势。统计信息的种类最终是8项。

  我决定拿Sqlite来作这个事情。Sqlite是个轻量级的数据库,它提供一个sqlite的命令行,通过它就能完成创建数据库、插入数据、查询等各种操作。我所要做的就是:

  1.从原始数据文件,也就是那个文本文件,生成一个sql语句文件,进而用sqlite生成数据库;
  2.生成查询统计信息的sql语句文件,然后用sqlite命令行进行查询。

  在shell程序中使用sqlite很方便,首先需要生成这样的sql语句文件
  sql语句文件sql.txt:
.output Somefile // 这句话告诉sqlite把sql执行的结果输出到文件
create tab ... // 正常的sql语句
insert into ....
.quit // 告诉sqlite退出

  然后,cat sql.txt | sqlite data.db。这样,sqlite就会执行sql.txt中的sql语句,并把结果保存到Somefile中。

  从原始数据生成创建数据库的sql.txt,当然是awk最胜任了。我也是这次才发现awk如此的好用。在计算平均值的时候也只能求助于它,因为它不会把商取整。
echo "$a $b"|awk '{ print $1/$2 }' #计算a/b的值

  最后说说shell编程,如果能有选择的话,我肯定会挑python、tcl甚至ruby,这样代码至少会让减少70%,看起来也会更elegant。一开始在Linux上写这个脚本,把对日期的处理完全交给date命令了,但是最终脚本运行在solaris上时,才发现solaris上的date傻得可以,只好自己处理日期的增减变化。不过提醒一下各位如果你们在Linux山写脚本要涉及日期的处理时,大可以把这份脏活交给date命令来作。

  比如你想看某个特定日期,比如说2005年10月1日,的前20天的日期,这么做就可以了:date "+%D" --date="10/01/2005 20 days ago"
文章评论

共有 0 条评论