背景:最近因为工作需要,会从系统log日志中扒统计数据,为了赶时间匆忙手工扒了一遍,劳心费力。于是完事后想了想搞个shell命令出来,以后就省事了。

用到的基本命令

for循环(条件循环)

语法:

for((i=1; i<=10; i++))  
{
    echo $i
}

for循环(列表循环)

语法:

for m in 1 2 3 4  
do  
    echo $m
done  

echo输出重定向

语法:

echo [-n] aaa > logfile  
echo [-n] bbb >> logfile  
其中,-n参数控制行尾是否换行,如果希望两次输出在同一行的话,加-n参数
用'>'重定向默认是覆盖写入,会覆盖前面的内容;用'>>'重定向默认是追加方式

grep匹配查询

语法:

grep [选项]... PATTERN [FILE]...  
在每个 FILE 或是标准输入中查找 PATTERN。
默认的 PATTERN 是一个基本正则表达式(缩写为 BRE)。

示例:

grep -i 'hello world' menu.h main.c  
从menu.h和main.c两个文件中查询'hello world',忽略大小写匹配

管道命令

语法:

操作符"|"
管道就是在一个命令完成后,把经由前面一个指令传出的正确输出信息作为输入信息来处理

示例:

grep aa logfile.log|grep bb  
从logfile.log中查询包含aa的结果,并从中再匹配包含bb的结果

wc统计命令

语法:

用法:wc [选项]... [文件]...
 或:wc [选项]... --files0-from=F
Print newline, word, and byte counts for each FILE, and a total line if  
more than one FILE is specified.  With no FILE, or when FILE is -,  
read standard input.  A word is a non-zero-length sequence of characters  
delimited by white space.  
The options below may be used to select which counts are printed, always in  
the following order: newline, word, character, byte, maximum line length.  
  -c, --bytes            print the byte counts
  -m, --chars            print the character counts
  -l, --lines            print the newline counts
      --files0-from=文件    从指定文件读取以NUL 终止的名称,如果该文件被
                    指定为"-"则从标准输入读文件名
  -L, --max-line-length    显示最长行的长度
  -w, --words            显示单词计数
      --help        显示此帮助信息并退出
      --version        显示版本信息并退出

示例:

grep aa logfile.log|wc -l 统计logfile.log中包含aa的行数  

其他知识

  • shell命令中赋值命令操作符"="两侧不能包含空格
  • 变量赋值后,引用变量时需要加"$"符号
  • 获取shell命令传入参数,可以用$0, $1, $2 其中,$0获取的是当前脚本名称,$1获取输入的第一个参数,以此类推
  • 更全面的bash编程语法,可参考Advanced Bash-Scripting Guide