写于2014年冬
简述
- Shell是系统的用户界面,提供了用户与内核进行交互操作的一种接口。它接收用户输入的命令并把它送入内核去执行。
- 实际上Shell是一个命令解释器,它解释由用户输入的命令并且把它们送到内核。不仅如此,Shell有自己的编程语言用于对命令的编辑,它允许用户编写由shell命令组成的程序。Shell编程语言具有普通编程语言的很多特点,比如它也有循环结构和分支控制结构等,用这种编程语言编写的Shell程序与其他应用程序具有同样的效果。
- 同Linux本身一样,Shell也有多种不同的版本。主要有下列版本的Shell
- Bourne Shell:Bourne shell 是UNIX 最初使用的shell,并且在每种UNIX 上都可以使用。Bourne
shell 在shell 编程方面相当优秀,但在处理与用户的交互方面做得不如其他几种shell。 - BASH:它是Bourne shell 的扩展,简称bash 。与Bourne shell 完全向后兼容,并且在Bourne shell
的基础上增加增强了很多特性,它还包含了很多C shell 和Kornshell 中的优点,有灵活和强大的编程接口同时又有很友好的用户界面。 - C Shell: C shell 是一种比Bourne shell 更适于编程的shell, 它的语法与C 语言很相似。Linux为喜欢使用C shell 的人提供了Tcsh。 Tcsh 是C shell 的一个扩展版本。Tcsh包括命令行编辑可编程单词补全、拼写校正历史命令替换、作业控制和类似C语言的语法。它不仅和Bash shell是提示符兼容而且还提供比Bashshell 更多的提示符参数。
- Korn shell 集合了C shell 和Bourne shell 的优点并且和Bourne shell 完全兼容Linux 系统提供了pdksh (ksh 的扩展),它支持任务控制,可以在命令行上挂起、后台执行、唤醒或终止程序
- Z Shell:The last shell you’ll ever need! Z是最后一个字母,也就是终极Shell。它集成了bash、ksh的重要特性,同时又增加了自己独有的特性。
- Bourne Shell:Bourne shell 是UNIX 最初使用的shell,并且在每种UNIX 上都可以使用。Bourne
变量与表达式
- $# : 保存程序命令行参数的数目
- $? : 保存前一个命令的返回码
- $0 : 保存程序名
- ∗:以(" 1 $2…”)的形式保存所有输入的命令行参数
- @:以(" 1”“$2”…)的形式保存所有输入的命令行参数
- -r file : 当file是一个可读文件时,返回True
- -w file : 当file是一个可写文件时,返回True
- -x file : 当file是一个可执行文件时,返回True
- -e file : 当file存在时,返回True
- -o file : 当file文件的所有者是当前用户时,返回True
- -z file : 当file长度为0时,返回True
- -f file : 当file是一个普通文件时,返回True
- -d file : 当file是一个目录时,返回True
- Exp1 || exp2 : 当exp1和exp2的值至少一个为True时,返回True
- Exp1 && exp2 : 当exp1和exp2的值同为True时,返回True
- ! exp : 当exp的值为False时,返回True
正则表达式
- 操作符 用途
- .(句号) 匹配任意单个字符。
- ^(脱字号) 匹配出现在行首或字符串开始位置的空字符串。
- $(美元符号) 匹配出现在行末的空字符串。
- A 匹配大写字母 A。
- a 匹配小写字母 a。
- \d 匹配任意一位数字。
- \D 匹配任意单个非数字字符。
- \w 匹配任意单个字母数字字符,同义词是 [:alnum:]。
- [A-E] 匹配任意大写的 A、B、C、D 或 E。
- [^A-E] 匹配除 A、B、C、D 和 E 之外的任意字符。
- X? 匹配出现零次或一次的大写字母 X。
- X* 匹配零个或任意个大写 X。
- X+ 匹配一个或多个字母 X。
- X{n} 精确匹配 n 个字母 X。
- X{n,m} 匹配最少 n 个并且不超过 m 个字母 X。如果省略 m,表达式将尝试匹配最少 n 个 X。
- (abc|def)+ 匹配一连串的(最少一个) abc 或 def;abc 和 def 将匹配。
find 和 xargs
- find是在系统中查找具有某一特征的文件 (例如文件权限、文件属主、文件长度、文件类型等等 )
- 选项
- -name 按照文件名查找文件。
- -perm 按照文件权限来查找文件。
- -prune 使用这一选项可以使 find命令不在当前指定的目录中查找,如果同时使用了 -depth选项,那么prune选项将被find命令忽略。
- -user 按照文件属主来查找文件。
- -group 按照文件所属的组来查找文件。
- -mtime -n +n 按照文件的更改时间来查找文件, - n表示文件更改时间距现在 n天以内, + n表示文件更改时间距现在 n天以前。
- -newer file1 ! file2 查找更改时间比文件 file1 新但比文件 file2旧的文件。
- -depth 在查找文件时,首先查找当前目录中的文件,然后再在其子目录中查找。
- xargs
- 在使用 find命令的-exec选项处理匹配到的文件时,find命令将所有匹配到的文件一起传递给exec执行。但有些系统对能够传递给exec的命令长度有限制,这样在find命令运行几分钟之后,就会出现溢出错误。错误信息通常是“参数列太长”或“参数列溢出”。这就是xargs命令的用处所在,特别是与find命令一起使用。
- 选项
- -0 当sdtin含有特殊字元时候,将其当成一般字符,想/’空格等
- -p 操作具有可交互性,每次执行comand都交互式提示用户选择
- -I xargs的每项名称,一般是一行一行赋值给{},可以用{}代替。-I 必须指定替换字符 -i 是否指定替换字符-可选
- -d delim 分隔符,argument的分隔符是空格
- -r 无参数时,停止 xargs
- 示例
find / -type f -print | xargs grep "device“
find ./ -name "*.log" | xargs -i cp {} ./a/
grep
- grep(全局正则表达式版本)允许对文本文件进行模式查找。如果找到匹配模式, grep打印包含模式的所有行。
grep支持基本正则表达式,也支持其扩展集。 grep [选项] 基本正则表达式 [文件] - 常用的 grep选项有:
- -c 只输出匹配行的计数。
- -i 不区分大小写(只适用于单字符)。
- -h 查询多文件时不显示文件名。
- -l 查询多文件时只输出包含匹配字符的文件名。
- -n 显示匹配行及行号。
- -s 不显示不存在或无匹配文本的错误信息。
- -v 显示不包含匹配文本的所有行。
- -w 完整匹配
- 示例
grep 'Time' load_ml.log
grep -c 'Time' load_ml.log
grep -v 'Time' load_ml.log
grep '2014-10-[1-8]' load_ml.log
grep '^[^2014]' load_ml.log
grep 'sql\{2,\}' load_ml.log
grep '^$' load_ml.log
ls -l | grep '^d‘
ps -ef | grep lock
sed
- sed是一个非交互性文本流编辑器。
- sed [ 选项] sed命令 输入文件。
- 选项
- n 不打印; sed不写编辑行到标准输出,缺省为打印所有行
- c 下一命令是编辑命令。使用多项编辑时加入此选项
- f 如果正在调用 sed脚本文件,使用此选项
- i 编辑当前文件
- 使用 sed在文件中定位文本的方式
- x x为一行号,如 1
- x , y 表示行号范围从 x到y,如 2, 5表示从第 2行到第 5行
- / pattern / 查询包含模式的行。例如 / d i s k /或/[a-z]/
- / pattern / pattern / 查询包含两个模式的行。例如 / d i s k / d i s k s /
- pattern / , x 在给定行号上查询包含模式的行。如 / r i b b o n / , 3
- x , / pattern / 通过行号和模式查询匹配行。 3 . / v d u /
- x , y ! 查询不包含指定行号 x和y的行。 1 , 2 !
- sed常用编辑命令
- p 打印匹配行
- d 删除定位行
- s 使用替换模式替换相应模式
- 示例
sed -n '1'p load_ml.log
sed -n '/Time/'p load_ml.log
sed -i 's/424.58s/124.53s/g' load_ml.log
awk
- 如果要格式化报文或从一个大的文本文件中抽取数据包,那么awk可以完成这些任务
- 操作符
- = += *= / = %= ^ = 赋值操作符
- ? 条件表达操作符
- || && ! 并、与、非
- ~! ~ 匹配操作符,包括匹配和不匹配
- < <= == != >> 关系操作符
- ++- - 前缀和后缀
- 内置变量
- ARGC 命令行参数个数
- ARGV 命令行参数排列
- ENVIRON 支持队列中系统环境变量的使用
- FILENAME a w k浏览的文件名
- FNR 浏览文件的记录数
- FS 设置输入域分隔符,等价于命令行 - F选项
- NF 浏览记录的域个数
- NR 已读的记录数
- ORS 输出记录分隔符
- RS 控制记录分隔符
- 内置字符串函数
- gsub(r,s) 在整个$0中用s替代
- rgsub(r,s,t) 在整个t中用s替代r
- index(s,t) 返回s中字符串t的第一位置
- length(s) 返回s长度
- match(s,r) 测试s是否包含匹配r的字符串
- split(s,a,fs) 在fs上将s分成序列
- asprint(fmt,exp) 返回经fmt格式化后的
- expsub(r,s) 用$0中最左边最长的子串代替s
- substr(s,p) 返回字符串s中从p开始的后缀部分
- substr(s,p,n) 返回字符串s中从p开始长度为n的后缀部分
示例
列出目录下的文件及总大小
ls -l | awk ' /^[^d]/ {print $9"\t"$5} {tot+=$5} END {print tot}'
模糊匹配
awk -F"|" '{if($1~/s_gn_/)s+=$5} END {print s}' load_analyze_2014-12-07.log
内置变量
awk -F"/" '{print NF, NR, $0} END {print FILENAME}' url.txt
数字计算
awk -F"|" '{$5=$5/1024/1024;print $1"\t"$5}' load_analyze_2014-12-07.log
Substr
[hadoop@centos6 log]$ str="1234567"
[hadoop@centos6 log]$ echo $str | awk '{print substr($str, 1,5)}‘杀掉进程
ps -ef | grep dispatch_day.sh | awk '{print $2}' | xargs kill -9
其他命令
- sort
- 对文本进行排序
- 常用选项
- -t 域分隔符
- -k 域编号
- -n 按数字排序
- -r 倒序
- 示例
sort -t"|" -k 5 -n -r load_analyze_2014-12-07.log
- uniq
- 用来从一个文本文件中去除或禁止重复行。一般 u n i q假定文件已分类,并且结果正确。
- 常用选项
- -u 只显示不重复行
- -d 只显示有重复数据行,每种重复行只显示其中一行
- -c 打印每一重复行出现次数。
- -f n为数字,前 n个域被忽略。
- 示例
awk -F"|" '{print $1"|"$5}' load_analyze_2014-12-07.log > a.log
uniq -c a.log
- join
- 用来将来自两个分类文本文件的行连在一起。
- 常用选项
- -o n.m n 为文件号, m为域号。 1 . 3 表示只显示文件 1 第三域,每个 n, m必须用逗号分隔,如1 . 3, 2 . 1 。
- -j n m n为文件号, m为域号。使用其他域做连接域。
- -t 域分隔符。用来设置非空格或 t a b键的域分隔符
- 示例
join -j1 1 -j2 1 -t"|" a.log b.log
- cut
- 从标准输入或文本文件中剪切列或域
- 选项
- -c list 指定剪切字符数。 -c 1, 5-7 剪切第 1 个字符,然后是第 5到第7个字符。
- -f field 指定剪切域数。 -f1,10-12 剪切第1域,第 1 0域到第 1 2域。
- -d 指定与空格和 tab键不同的域分隔符
- 示例
- echo load_analyze_2014-12-07.log | cut -d “_” -f 1 | cut -c1-3
- split
- 将大文件分割成小文件
- 选项
- -output_file-size 行数,默认1000
- 示例
- split -4000 a.log
- curl
- 一个功能强大的网络工具,它能够通过http、ftp等方式下载文件,也能够上传文件。
- 常用选项
- -d/–data HTTP POST方式传送数据
- -x/–proxy 指定代理服务器地址和端口,端口默认为1080
- -O:按照服务器上的文件名,自动存在本地
- -T/–upload-file 上传文件
- -u/–user 设置服务器的用户和密码
- 示例
- curl -d “to=136&message=hello test” http://msg:9090/msg
基础编程
- 条件测试
- 表达式 [ condition ]
- 文件状态
- -d 目录
- -s 文件长度大于 0、非空
- -f 正规文件
- -w 可写
- -L 符号连接
- -u 文件有 suid位设置
- -r 可读
- -x 可执行
- 逻辑操作符
- -a 逻辑与
- -o 逻辑或
- ! 逻辑否
- 字符串比较
- == 两个字符串相等。
- != 两个字符串不等。
- -z 空串。
- -n 非空串。
- 数字比较
- -eq 数值相等。
- -ne 数值不相等。
- -gt 第一个数大于第二个数。
- -lt 第一个数小于第二个数。
- -le 第一个数小于等于第二个数。
- -ge 第一个数大于等于第二个数
- 控制流
- If then else
- case
- for
- until
- While
- Break and continue
Shell函数
- 函数必须放在脚本主体前面
- 函数通过return 或者echo返回值
- 函数文件必须是完整路径
- 示例
mv_log () {
file=$1
file_name=`echo $file | awk -F"," '{print $1}'`
size=`echo $file | awk -F"," '{print $2}'`
before_size=`cat $tmp_file | grep -w $file_name | awk -F"," '{print $2}'`
if [ "$before_size" == "$size" ]
then
mv $file_name $dest_dir/${file_name} -f &
else
echo $file_name","$size >> $before_file
fi
}
与其他配合
- 多进程
- 调用的函数或者命令后加 &
- wait 等待后台进程结束
- FTP
open 10.95.3.133
user $user $password
bin
cd pub #必须先cd,然后获取
get zlib-devel-1.2.3-29.el6.x86_64.rpm
quit
EOF```
#数据库
/opt/gcluster/server/bin/gbase -h$db_host -u$db_user -p$db_passwd -vvv -e "use $db_name; call p_g_dispatch_day('$data_time');"
参考资料
- Shell脚本学习指南 机械工业出版社
- Linux命令行与shell脚本编程大全(第2版)人民邮电出版社
- AWK Language Programming http://www.math.utah.edu/docs/info/gawk_1.html
- Sed - An Introduction and Tutorial http://www.grymoire.com/Unix/Sed.html
- GNU Grep 2.21 http://www.gnu.org/software/grep/manual/grep.html
- 使用Shell脚本对Linux系统和进程资源进行监控 http://www.youkuaiyun.com/article/2012-06-26/2806898
- 写出健壮的Bash脚本 http://www.youkuaiyun.com/article/2012-03-19/313229
- Linux Shell 编程实战技巧 http://blog.jobbole.com/48717/
- 37条常用Linux Shell命令组合 http://blog.jobbole.com/48173/
- Shell论坛 http://bbs.chinaunix.net/forum-24-1.html