shell编程
来源:互联网 发布:网络招投标系统 编辑:程序博客网 时间:2024/06/10 05:18
正则表达式
linux正则和通配符的区别
通配符:用来匹配符合条件的文件名,通配符是完全匹配。ls,find,cp这些命令不支持正则表达式正则表达式:用来在文件中匹配符合条件的字符串,正则是包含匹配。grep,awk,sed等命令可以支持正则表达式。
linux通配符
linux基础正则表达式
[ ] |匹配中括号中指定的任意一个字符,只匹配一个字符,要匹配[则要转义[
[^] | 匹配除中括号的字符以外的任意一个字符
\ |转义符用于取消特殊符号的含义,匹配包含以.结尾的行grep “.$” test.txt
\{n\}| 表示其前面的字符恰好出现n次。例如:[0-9]{4}匹配4位数字,但注意添加两边的定界符,以精确匹配
\{n,\} | 表示其前面的字符出现不小于n次。例如:[0-9]{2,}匹配2位以上的数字
\{n,m\} | 表示其前面的字符至少出现n次,最多出现m次。例如:[a-z]{6,8}匹配6到8位的小写字母
- 注1:“?”、“ ()”是扩展正则中的元字符
- 注2:正则表达式中使用以上的元字符,如[]、{}、*、. 等所以在匹配字符串中包含有这些元字符时必须使用反斜杠(“\”)转义,但像<>这个非元字符符号就不需要转义。
字符截取命令
cut命令
- 格式:cut [选项] 文件名
- 选项:
- -f 列号: 提取第几列
- -d 指定分隔符:按指定的分隔符分割分割列(不能使用空格作为分割符)
printf命令
- printf ‘输出的类型输出格式’ 输出内容
- 输出类型:
%-5s 格式为左对齐且宽度为5的字符串代替(-表示左对齐),不使用则是又对齐
%-4.2f 格式为左对齐宽度为4,保留两位小数 - 输出格式:
\a 警告字符,通常为ASCII的BEL字符
\b 后退
\c 抑制(不显示)输出结果中任何结尾的换行字符(只在%b格式指示符控制下的参数字符串中有效),而且,任何留在参数里的字符、任何接下来的参数以及任何留在格式字符串中的字符,都被忽略
\f 换页(formfeed)
\n 换行
\r 回车(Carriage return)
\t 水平制表符
\v 垂直制表符
awk
awk的工作原理
awk 'BEGIN{ commands } pattern{ commands } END{ commands }'第一步:执行BEGIN{ commands }语句块中的语句; 第二步:从文件或标准输入(stdin)读取一行,然后执行pattern{ commands }语句块,它逐行扫描文件,从第一行到最后一行重复这个过程,直到文件全部被读取完毕。 第三步:当读至输入流末尾时,执行END{ commands }语句块。 BEGIN语句块在awk开始从输入流中读取行之前被执行,这是一个可选的语句块,比如变量初始化、打印输出表格的表头等语句通常可以写在BEGIN语句块中。 END语句块在awk从输入流中读取完所有的行之后即被执行,比如打印所有行的分析结果这类信息汇总都是在END语句块中完成,它也是一个可选语句块。 pattern语句块中的通用命令是最重要的部分,它也是可选的。如果没有提供pattern语句块,则默认执行{ print },即打印每一个读取到的行,awk读取的每一行都会执行该语句块。
awk常用命令选项
-F fs fs指定输入分隔符,fs可以是字符串或正则表达式,如-F: -v var=value 赋值一个用户定义变量,将外部变量传递给awk -f scripfile 从脚本文件中读取awk命令 -m[fr] val 对val值设置内在限制,-mf选项限制分配给val的最大块数目;-mr选项限制记录的最大数目。这两个功能是Bell实验室版awk的扩展功能,在标准awk中不适用。
awk print与printf的差别
printf:可以自定义输出的模式,另外输出内容之后不自动换行print:输出内容之后自动换行
awk经典例子
统计/etc/passwd:文件名,每行的行号,每行的列数,对应的完整行内容:#awk -F ':' '{print "filename:" FILENAME ",linenumber:" NR ",columns:" NF ",linecontent:"$0}' /etc/passwdfilename:/etc/passwd,linenumber:1,columns:7,linecontent:root:x:0:0:root:/root:/bin/bashfilename:/etc/passwd,linenumber:2,columns:7,linecontent:daemon:x:1:1:daemon:/usr/sbin:/bin/shfilename:/etc/passwd,linenumber:3,columns:7,linecontent:bin:x:2:2:bin:/bin:/bin/shfilename:/etc/passwd,linenumber:4,columns:7,linecontent:sys:x:3:3:sys:/dev:/bin/sh使用printf替代print,可以让代码更加简洁,易读#awk -F ':' '{printf("filename:%10s,linenumber:%s,columns:%s,linecontent:%s\n",FILENAME,NR,NF,$0)}' /etc/passwd以上两种方式所得结果相同!
sed命令
sed的处理过程
sed编辑器逐行处理文件(或输入),并将结果发送到屏幕。具体过程如下:首先sed把当前正在处理的行保存在一个临时缓存区中(也称为模式空间),然后处理临时缓冲区中的行,完成后把该行发送到屏幕上。sed每处理完一行就将其从临时缓冲区删除,然后将下一行读入,进行处理和显示。处理完输入文件的最后一行后,sed便结束运行。前面说到sed不会修改文件,那么现在我们可以知道是为什么了?是因为sed把每一行都存在临时缓冲区中,对这个副本进行编辑,所以不会修改原文件。
补充知识:
在使用sed的过程中,我们经常会听到“定址”,那么什么是“定址”呢?
定址用于决定对哪些行进行编辑。地址的形式可以是数字、正则表达式、或二者的结合。如果没有指定地址,sed将处理输入文件的所有行。
1、地址是一个数字,则表示行号;是“$”符号,则表示最后一行。
例如:
[plain] view plaincopy在CODE上查看代码片派生到我的代码片
sed -n '3p' datafile #只打印第三行
- 2、只显示指定行范围的文件内容
例如:
[plain] view plaincopy在CODE上查看代码片派生到我的代码片sed -n '100,200p' mysql_slow_query.log # 只查看文件的第100行到第200行
- 3、地址是逗号分隔的,那么需要处理的地址是这两行之间的范围(包括这两行在内)。范围可以用数字、正则表达式、或二者的组合表示。
例如:
[plain] view plaincopy在CODE上查看代码片派生到我的代码片sed '2,5d' datafile #删除第二到第五行 sed '/My/,/You/d' datafile #删除包含"My"的行到包含"You"的行之间的行 sed '/My/,10d' datafile #删除包含"My"的行到第十行的内容
sed命令和选项
sed命令告诉sed如何处理由地址指定的各输入行,如果没有指定地址则处理所有的输入行。
1、sed命令
2、sed选项
sed的退出状态
sed不向grep一样,不管是否找到指定的模式,它的退出状态都是0。只有当命令存在语法错误时,sed的退出状态才不是0。
http://blog.csdn.net/engledb/article/details/19623087
排序命令sort
sort [选项] 文件名-f, --ignore-case 忽略字母大小写-g, --general-numeric-sort 按照常规数值排序-i, --ignore-nonprinting 只排序可打印字符-n, --numeric-sort 根据字符串数值比较-r, --reverse 逆序输出排序结果-k, --key=位置1[,位置2] 在位置1 开始一个key,在位置2 终止(默认为行尾)-t, --field-separator=分隔符 使用指定的分隔符代替非空格到空格的转换
条件判断
两种判断格式
test 选项 文件名[ 选项 文件名 ]
按照文件类型进行判断
[ -d FILE ] 如果 FILE 存在且是一个目录则返回为真。[ -e FILE ] 如果 指定的文件或目录存在时返回为真。[ -f FILE ] 如果 FILE 存在且是一个普通文件则返回为真。[ -a FILE ] 如果 FILE 存在则为真。[ -b FILE ] 如果 FILE 存在且是一个块文件则返回为真。[ -c FILE ] 如果 FILE 存在且是一个字符文件则返回为真。[ -h FILE ] 如果 FILE 存在且是一个符号符号链接文件则返回为真。(该选项在一些老系统上无效)[ -p FILE ] 如果 FILE 存并且是命令管道时返回为真。[ -s FILE ] 如果 FILE 存在且大小非0时为真则返回为真。[ -O FILE ] 如果 FILE 存在且属有效用户ID则返回为真。[ -G FILE ] 如果 FILE 存在且默认组为当前组则返回为真。(只检查系统默认组)[ -L FILE ] 如果 FILE 存在且是一个符号连接则返回为真。[ -N FILE ] 如果 FILE 存在 and has been mod如果ied since it was last read则返回为真。[ -S FILE ] 如果 FILE 存在且是一个套接字则返回为真。
按照文件权限进行判断
[ -r FILE ] 如果 FILE 存在且是可读的则返回为真。[ -w FILE ] 如果 FILE 存在且是可写的则返回为真。(一个目录为了它的内容被访问必然是可执行的)[ -x FILE ] 如果 FILE 存在且是可执行的则返回为真。[ -g FILE ] 如果 FILE 存在且设置了SGID则返回为真。[ -u FILE ] 如果 FILE 存在且设置了SUID位时返回为真。[ -k FILE ] 如果 FILE 存在且已经设置了冒险位则返回为真。
两个文件之间进行比较
[ FILE1 -nt FILE2 ] 如果 FILE1 比 FILE2 新, 或者 FILE1 存在但是 FILE2 不存在则返回为真。[ FILE1 -ot FILE2 ] 如果 FILE1 比 FILE2 老, 或者 FILE2 存在但是 FILE1 不存在则返回为真。[ FILE1 -ef FILE2 ] 如果 FILE1 和 FILE2 指向相同的设备和节点号则返回为真。
两个整数之间进行比较
[ INT1 -eq INT2 ] INT1和INT2两数相等返回为真 ,=[ INT1 -ne INT2 ] INT1和INT2两数不等返回为真 ,<>[ INT1 -gt INT2 ] INT1大于INT2返回为真 ,>[ INT1 -ge INT2 ] INT1大于等于INT2返回为真,>=[ INT1 -lt INT2 ] INT1小于INT2返回为真 ,<[ INT1 -le INT2 ] INT1小于等于INT2返回为真,<=
两个字符串之间进行比较
[ -z STRING ] 如果STRING的长度为零则返回为真,即空是真[ -n STRING ] 如果STRING的长度非零则返回为真,即非空是真[ STRING1 ] 如果字符串不为空则返回为真,与-n类似[ STRING1 == STRING2 ] 如果两个字符串相同则返回为真[ STRING1 != STRING2 ] 如果字符串不相同则返回为真[ STRING1 < STRING2 ] 如果 “STRING1”字典排序在“STRING2”前面则返回为真。[ STRING1 > STRING2 ] 如果 “STRING1”字典排序在“STRING2”后面则返回为真。
多重条件判断
[ ! EXPR ] 逻辑非,如果 EXPR 是false则返回为真。[ EXPR1 -a EXPR2 ] 逻辑与,如果 EXPR1 and EXPR2 全真则返回为真。[ EXPR1 -o EXPR2 ] 逻辑或,如果 EXPR1 或者 EXPR2 为真则返回为真。[ ] || [ ] 用OR来合并两个条件[ ] && [ ] 用AND来合并两个条件
流程控制
if语句
单分支、双分支、多分支if [] ;thenfiif [] ;thenelsefiif [] ;thenelifelfielsefi
case语句
case $变量名 in 模式1) 命令序列1 ;; 模式2) 命令序列2 ;; *) 默认执行的命令序列 ;; esac
for循环
1)循环体前用in,循环体用{ }大括号括起来,然后用do和done。2)不带列表的for循环,for后直接跟条件,然后用do和done。3)类C风格的for循环,for后边用(())两层双括号括住条件,条件之间用;分号隔开,然后用do和done。
#!/bin/bash #打印1~5的for语句 for i in {1..5};do #数字段形式 echo $i done for i in 1 2 3 4 5;do #详细列出(字符且项数不多) echo $i done for ((i=1;i<=5;i++));do #((语法循环--有点像C语法,但记得双括号 echo $i done for i in `seq 5`;do #seq形式 起始从1开始,sequence序列 echo $i done
while循环
while循环语句也称前测试循环语句,它的循环重复执行次数,是利用一个条件来控制是否继续重复执行这个语句。while语句与for循环语句相比,无论是语法还是执行的流程,都比较简明易懂。while循环格式如下: while expression do command command … done
until循环
until循环 测试条件 do 语句1 语句2 done
条件不满足循环,直到满足就退出循环;
- 1.练习:提取 df -h的命令的根分区的使用率,如果大于80%,输出提示信息!
- 2.备份数据库文件
- 3.判断Apache是否启动!
- 批量的解压缩(for)
- 批量添加指定数量的用户
阅读全文
0 0
- shell 以及shell编程
- Shell和Shell编程
- 【shell】shell 编程基础
- Shell及其Shell编程
- Shell编程
- Shell编程
- Shell编程
- shell编程
- Shell编程
- Shell编程
- shell 编程
- Shell编程
- Shell编程
- shell编程
- shell编程
- Shell编程
- shell编程
- Shell 编程
- MySQL组复制(Group Replication)
- MacOS 开发
- 多态
- Java Classloader原理分析
- 谈谈分布式的通用问题
- shell编程
- SQL中的case when then else end用法
- C语言学习总结
- 删除Git提交记录
- HDU 5917:Ramsey定理
- 什么是面向对象对象,什么是面向过程,什么是面向对象思想。
- POJ 3518
- 深夜切题——PKKJ的生日礼物
- Java基础-为什么要抽象?