异想天开

What's the true meaning of light, Could you tell me why

shell code

日期:2014-04-15 20:00:19
  
最后更新日期:2014-05-06 10:34:56
背景:
今后打算看下nginx源码,并整理出来心得。想统计一下,nginx源码有多少行,shell code对于做这类事很在行。如是便想总结下工作中经常用到的shell命令,在此作个记录。
1.统计源代码需求
[code lang="cpp"]
// find ./ \( -name "*.c" -o -name "*.h" \) -print \
| xargs grep -v "^$" | wc -l | awk '{s+=$1}END{print s}'
[/code]
注:
1.利用了管道,将要解决问题分解为几个步骤,很模块化的做法,可以依次查看每个命令的输出效果,便于学习。
2.find命令将所有c文件及h文件路径打印出来。
3.xargs非常有用,将标准输出作为命令行参数传递进来。grep -v "^$"去掉空行。
4.wc统计行数。
5.awk将行中用到的信息提炼出来。这里提取每行第一列的值。
PS:工作中这几个命令应用的相当频繁,对这几个一定要灵活运用
2.统计数据库n张表的总行数
[code lang="cpp"]
//query.sh
#!/bin/sh

for(( i=1;i<=16;++i))
{
TABLE="token$i"
echo -e '\n'
echo "query $NUM table $TABLE"

mysql -uroot -hlocalhost -p123456 <<EOF
select count(*) from $TABLE where 1=1
EOF

}
[/code]
上诉脚本列举每张表里面的行数,利用了一个技巧,在shell脚本里面将"EOF"和"EOF"之间的内容传递给mysql命令,这个小技巧可以方便用于自动化处理。然后执行下面的命令就可以统计出来了。
[code lang="cpp"]
./query.sh | awk '/^[01234567890]/{print $1}' | awk '{ total += $1 } END{ print total}'
[/code]
PS:是不是又用到了awk。

3.实际需求
去掉某个源文件的空行
[code lang="cpp"]
cat test.cpp | grep -Ev "^ *$"
[/code]
PS:导到标准输出,grep正则反向匹配去掉从开头要结尾都是空格的行。

4.shell脚本的调试方法
编写完一个shell脚本,没有得到预想的输出,想知道哪个地方出错了。那么调试就派上用场了。程序调试打日志是一个非常好的习惯,shell里面也可以用echo查看变量的值。
1.sh -x ./test.sh
用-x模式执行脚本,会打印每条执行命令。
2.tee命令会从标准输入读取数据,将其内容输出到标准输出设备,同时又可将内容保存成文件,这对于通过管道来连接的命令比较奏效。
PS:看来初学者写完shell之后,最好用-x检查下语法错误。今天eq,忘记前面加-。