shell编程

来源:互联网 发布:网络招投标系统 编辑:程序博客网 时间:2024/06/10 05:18

正则表达式

linux正则和通配符的区别

通配符:用来匹配符合条件的文件名,通配符是完全匹配。ls,find,cp这些命令不支持正则表达式正则表达式:用来在文件中匹配符合条件的字符串,正则是包含匹配。grep,awk,sed等命令可以支持正则表达式。

linux通配符

元字符 作用 * 匹配0个或任意多个字符,也就是可以匹配任何内容 ? 匹配任意一个字符 [] 匹配[ ]中任意一个字符 [-] 匹配括号中任意一个字符,-代表一个范围,例如:[a-z]代表匹配一个小写字母 [^] 逻辑非,表示匹配不是中括号内的一个字符,例如[^0-9]代表匹配一个不是数字的字符

linux基础正则表达式

元字符 作用 * 前一个字符匹配0次或任意多次,匹配0次前一个字符则表示匹配任意字符,包括空白行 . 匹配除了换行符以外任意一个字符,“.*”匹配所有内容 ^ 用于指定匹配字符串的头部,也称行首定位符;匹配行首。例如:^hello会匹配以hello开头的行,grep -n “^$” test.txt匹配空白行并显示行号

|hello会匹配以hello结尾的行
[ ] |匹配中括号中指定的任意一个字符,只匹配一个字符,要匹配[则要转义[
[^] | 匹配除中括号的字符以外的任意一个字符
\ |转义符用于取消特殊符号的含义,匹配包含以.结尾的行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 [选项] 文件名
  • 选项:
    1. -f 列号: 提取第几列
    2. -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命令

命令 功能 a\ 在当前行后添加一行或多行。多行时除最后一行外,每行末尾需用“\”续行 c\ 用此符号后的新文本替换当前行中的文本。多行时除最后一行外,每行末尾需用”\”续行 i\ 在当前行之前插入文本。多行时除最后一行外,每行末尾需用”\”续行 d 删除行 h 把模式空间里的内容复制到暂存缓冲区 H 把模式空间里的内容追加到暂存缓冲区 g 把暂存缓冲区里的内容复制到模式空间,覆盖原有的内容 G 把暂存缓冲区的内容追加到模式空间里,追加在原有内容的后面 l 列出非打印字符 p 打印行 n 读入下一输入行,并从下一条命令而不是第一条命令开始对其的处理 q 结束或退出sed r 从文件中读取输入行 ! 对所选行以外的所有行应用命令 s 用一个字符串替换另一个 g 在行内进行全局替换 w 将所选的行写入文件 x 交换暂存缓冲区与模式空间的内容 y 将字符替换为另一字符(不能对正则表达式使用y命令)

2、sed选项

选项 功能 -e 进行多项编辑,即对输入行应用多条sed命令时使用 -n 取消默认的输出 -f 指定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)
  • 批量添加指定数量的用户
原创粉丝点击