2 shell编程

Linux下有文本处理三剑客 -- grep sed awk

       grep:文本 行过滤工具

       sed: 文本 行编辑器(流编辑器)

       awk:报告生成器(做文本输出格式化)

一、正则表达式

       1、基础正则表达式

              *      匹配前一个字符0次或任意多次       (a*表示匹配前一个字符0次或任意多次,这样写没有任何意义,会匹配所有。aa*表示匹配至少包含一个a的行)

              .      匹配除了换行符外任意一个字符

              ^ $  行首和行尾   

              [ ]    中括号中任意一个字符

              \{n\} 表示前面的字符恰好出现n次    \是转义符

              \{n,\}       表示其前面的字符出现不小于 n 次

              \{n,m\}    表示前一个字符至少出现n次,最多出现m次

       2、扩展正则

              不需要加转义符

              +     前一个字符匹配1次或任意多次

              ?      前一个字符匹配0次或1次

              |      匹配两个或多个分支选择

              ()     匹配一个整体

             

二、字符截取和替换命令

       1、cut

              cut 命令的默认分隔符是制表符,也就是“tab”键

              -f     列号

              -d   分隔符

              -c    字符范围

       2、awk

              常见参数

                     -F    指定分隔符

                     -v    手动指定变量参数

              1)printf格式化输出

                     printf ‘输出类型输出格式’ 输出内容

                     输出类型:  %ns:  输出字符串。n 是数字指代输出几个字符 

                     %ni:  输出整数。n 是数字指代输出几个数字 

                     %m.nf:  输出浮点数。m 和 n 是数字,指代输出的整数位数和小数位数。如%8.2f 代表共输出 8 位数,

                     其中 2 位是小数,6 位是整数。

                     +右对齐

                     -左对齐

                     例子:

                     查看系统中的id大于等于1并小于等于500的用户

                     cat /etc/passwd |awk 'BEGIN{FS=":"} $3>=1&&$3<=500{printf "%-10s %-10d\n",$1,$3}'

 

             

              2)awk基本使用

                      awk ‘条件 1{动作 1} 条件 2{动作 2}…’ 文件名                

                      例如:df -h|grep /dev/sda3|awk '{print $5}'   提取根分区占有率

 

              3)awk的条件

                     BEGIN     在 awk 程序一开始时,尚未读取任何数据之前执行。BEGIN后的动作只在程序开始时执行一次

                     END 在 awk 程序处理完所有数据,即将结束时执行。END 后的动作 只在程序结束时执行一次

                    

                     >  >=   <   <=    ==   !=

                     A~B       判断字符串 A 中是否包含能匹配 B 表达式的子字符串

                     A!~B      判断字符串 A 中是否不包含能匹配 B 表达式的子字符串

                     /正则/

                    

              4)awk的内置变量

                     $0   代表目前 awk 所读入的整行数据。我们已知 awk 是一行一行读入数据 的,$0 就代表当前读入行的整行数据

                     $n   代表目前读入行的第 n 个字段。

                     NF   当前行拥有的字段(列)总数。

                     NR   当前 awk 所处理的行,是总数据的第几行。

                     FS    用户定义分隔符。awk 的默认分隔符是任何空格,如果想要使用其他 分隔符(如“:”),就需要 FS 变量定义

                     OFS 输出字段的分隔符(默认为空格)。

                    

       例子:统计历史命令使用次数最多的

              history |awk -F '[ ]+' '{print $3}'|sort|uniq -c|sort -nr|head     

       3、sed

              sed 主要是用来将数据进行选取、替换、删除、新增的命令

              sed [选项] ‘[动作]’ 文件名

              选项:   

                     -n   一般 sed 命令会把所有数据都输出到屏幕,如果加入此选择,则只会把经过 sed 命令处理的行输出到屏幕。

                     -r    在 sed 中支持扩展正则表达式

                     -i     用 sed 的修改结果直接修改读取数据的文件,而不是由屏幕输出

              动作:

                     a \:        追加,在当前行后添加一行或多行。添加多行时,除最后 一行外,      每行末尾需要用“\”代表数据未完结。

                     c \:         行替换,用 c 后面的字符串替换原数据行,替换多行时,除最后一行      外,每行末尾需用“\”代表数据未完结。 

                     i \:   插入,在当期行前插入一行或多行。插入多行时,除最后 一行外,      每行末尾需要用“\”代表数据未完结。 

                     d:         删除,删除指定的行。

                     p:        打印,输出指定的行

                     s:        字串替换,用一个字符串替换另外一个字符串。格式为“行范围 s/      旧字串/新字串/g”(和 vim 中的替换格式类似)

 

三、字符处理命令

       1、sort                

              sort [选项] 文件名

              -f:  忽略大小写

              -b:  忽略每行前面的空白部分

              -n:  以数值型进行排序,默认使用字符串型排序

              -r:  反向排序

              -u:  删除重复行。就是 uniq 命令

              -t:  指定分隔符,默认是分隔符是制表符

              -k n[,m]: 按照指定的字段范围排序。从第 n 字段开始,m 字段结束(默认到行尾)

       2、uniq

              uniq [选项] 文件名

              -i: 忽略大小写

       3、wc

              -l: 只统计行数

              -w: 只统计单词数

              -m: 只统计字符数

              -L:统计单词字符数

四、条件判断

       1、按照条件进行判断

              test 

                     -d   判断目录是否存在

                     -e    判断文件是否存在

                     -f    判断是否为普通文件

                     -s    判断文件是否为空

 

       2、按照文件权限判断

                     -r

                     -w

                     -x

                     -u   判断是否有suid权限

                     -g   判断是否有sgid权限

                     -k    判断是否有sbit权限

       3、两文件之间的判断

                     文件1 -nt 文件2   判断文件 1 的修改时间是否比文件 2 的新(如果新则为真)

                     文件 1 -ot 文件 2      判断文件 1 的修改时间是否比文件 2 的旧(如果旧则为真)

                     文件 1 -ef 文件 2      判断文件 1 是否和文件 2 的 Inode 号一致,可以理解为两个文件是否 为同一个文件。这个判断用于判断硬链接是很好的方法

 

       4、整数判断

                     -eq  等于

                     -gt  大于

                     -ge  大于等于

                     -lt  小于

                     -le  小于等于

      

       5、字符串判断

                     -z    判断字符串是否为空(为空返回真)

                     -n   判断字符串是否为非空(非空返回真)

                     ==   判断字符串 1 是否和字符串 2 相等(相等返回真)

                     != 判断字符串 1 是否和字符串 2 不相等(不相等返回真)

       6、多重条件判断

                     判断 1 -a 判断 2          逻辑与,判断 1 和判断 2 都成立,最终的结果才为真

                     判断 1 -o 判断 2          逻辑或,判断 1 和判断 2 有一个成立,最终的结果就为真

                     !判断              逻辑非,使原始的判断式取反

 

五、流程控制

       1、单分支if

              if [  ];then

                     执行体   

             fi

 

       2、双分支if

              if [  ];then

                     条件成立执行

              else

                     条件不成立执行

              fi

       3、多分支if

              if [  ];then

                     条件成立执行

              elif [ ];then

                     条件成立执行

              else

                     所有条件不成立执行

              fi

 

       4、多分支case条件语句

              case只能判断一种条件关系,而if可以判断多种

              case 变量 in

              值1)

                     执行体

              ;;

              值2)

                     执行体

              ;;

              *)

                     如果变量都不是以上的值,则执行此

              ;;

              esac

             

       5、for循环

              for i in 条件 ; do

                     循环体

              done     

             

              for((初始值;循环控制条件;变量变化))

              do

                     循环体

              done

       6、while循环

              while [ 条件判断 ];do

             

              done

 

posted @ 2019-08-28 08:57  留白、  阅读(111)  评论(0编辑  收藏  举报