zoukankan      html  css  js  c++  java
  • 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 ",$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

  • 相关阅读:
    使用python2 对服务器监控(监控内存,CPU,网卡流量等)
    centos7使用yum提示有事物未完成的解决办法:
    如何判断Linux下 网卡是虚拟还是物理网卡?
    python3监控系统资源最终版(获取CPU,内存,磁盘,网卡等信息),返回json格式。
    python3 系统监控脚本(2) (监控CPU,内存等信息)
    python3 系统监控脚本(CPU,memory,网络,disk等)
    获取Linux系统运行时间
    Linux之jq
    hadoop--presto安装部署
    docker 笔记--运行中的容器如何添加端口映射
  • 原文地址:https://www.cnblogs.com/baci/p/11421943.html
Copyright © 2011-2022 走看看