Linux Shell编程

一,基础正则表达式

  1,正则表达式与通配符

    1,正则表达式用来在文件中匹配符合条件的字符串,正则是包含匹配,grep,awk,sed等命令可以支持正则表达式

    2,通配符用来匹配符合条件的文件名,通配符是完全匹配,ls find cp 这些命令不支持正则表达式,所以只能使用shell自己的通配符来进行匹配了

  2,基础正则表达式

    

表达式 含义
^ ^word表示匹配以word开头的内容(打印的是一行内容),vi/vim 编辑器里^代表一行的开头
$ word$表示匹配word结尾的内容(打印的是一行内容),vi/vim编辑器里$代表一行的结尾
^$ 表示空行
. 代表且只能代表任意一个字符
\ \.就只代表点本身,转义符号,让有着特殊身份意义的字符,脱掉马甲,还原原形
* 重复0个或多个前面一个字符,例如:0*,有1个0或多个000000
.* 匹配所有字符,延伸^.*以任意多个字符开头,.*$以任意多个字符结尾
[abc] 匹配字符集合内的任意一个字符[a-zA-Z],[0-9](单个字符而不是包含的单词)
[^abc] 匹配不包含^后的任意一个字符的内容(单个字符而不是包含的单词);其中括号里^为取反,注意和中括号内以^开头区别
a\{n,m\}

重复n到m次,前一个重复的字符,如果用egrep/sed -r可以去掉斜线;

例子:gerp "0\{3,4\}" syz.log  意思为,0匹配,3-4次

         my qq name is 49000448

         not 490000048

a\{n,\} 重复至少n次,前一个重复的字符,如果用egrep/sed -r 可以去到斜线
a\{n\}

重复n次,前一个重复的字符,如果用egrep/sed -r 可以去掉斜线

例子:gerp "0\{3\}" syz.log  意思为,0匹配,3次

         my qq name is 49000448

a\{,m\}

????Centos5不能用,Centos6、7可以用

例子:gerp "0\{3\}" syz.log  意思为,0匹配,3次

         my qq name is 49000448

 

二,字符截取命令

  1,cut字段提取命令 (提取符合条件的列)

    cut 【选项】文件名 (一般cut 和 grep 配合使用)

    选项:

      -f 列号:提取第几列

      -d 分隔符:按照指定分隔符分割列

  2,printf 命令

    printf '输出类型输出格式' 输出内容

    输出类型:

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

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

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

  

  hint :在$()中,()执行的内容是一条系统命令

  在awk命令的输出中支持print 和 printf命令

    1,print:print会在每个输出之后自动加入一个换行符(Linux默认没有print命令)

    2,printf:printf是标准格式输出命令,并不会自动加入换行符,如果需要换行,需要手工加入换行符

  3,awk命令

    awk '条件1{动作1} 条件2{动作2} .....' 文件名

    条件(pattern):

      一般使用关系表达式作为条件

       x>10 判断x变量是否大于10

       x>=10判断x变量是否大于等于10

      x<=10判断x变量是否小于10

    动作(Action):

      格式化输出

      流程控制语句

    例如:

      awk '{printf $2 "\t" $6 "\n"}' student.txt

      df -h | awk '{print $1 "\t" $3}'

    hint :print 会自动加换行符

    因为cut命令是使用制表符\t来进行分割的,当列分割使用的是空格的时候,想要分割得到列我们就需要使用到awk

    例如:

      df -h | grep "sda" | awk '{printf $5 "\n" } | cut -d "%" -f 1

    

    awk中的BEGIN

      awk ‘ BEGIN {printf "This is a transcript \n"} {printf $2 "\t" $6 "\n"} ’ student.txt

      会在处理分割之前先输出一行This is a transcript

    awk的FS内置变量 (定义分隔符)

      cat /etc/passwd | grep "/bin/bash" | awk 'BEGIN {FS=":"}{printf $1 "\t" $3 "\n"}'

    hint:awk处理时是先读入第一行数据再进行处理

    awk中的END(与BEGIN相对,在所有数据处理完后执行)

      awk 'END {printf "The End \n"}{printf $2 "\t" $6 "\n"}' student.txt

    awk中的关系运算符:

      cat student.txt | grep -v Name | awk '$6>=87 {printf $2 "\n"}'

  4,sed命令

    sed是一种几乎包括在所有Unix平台(包括linux)的轻量级流编辑器,sed主要是用来将数据进行选取,替换,删除,新增的命令

    sed【选项】'动作' 文件名

    选项:

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

      -e 允许对输入数据应用多条sed命令编辑

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

    动作:

      a\:追加

      c\:行替换

      i\:插入

      d:删除

      p:打印

      s:字串替换

    例如:

      sed -n '2p' student.txt

      df -h | sed -n '2p'

      sed '2,4d' student.txt

      sed '2a zuobi' student.txt  追加在行末

      sed '2c No much person' student.txt  数据替换

    字符串替换

      sed 's/旧字符串/新字符串/g' 文件名

      sed '3s/74/99/g' student.txt

 

三,字符处理命令:

  1,排序命令 sort

    sort 【选项】文件名

    选项:

      -f  忽略大小写

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

      -r  反向排序

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

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

      sort -n -t ":" -k 3,3 /etc/passwd

  2,统计命令 wc

    wc【选项】文件名

    选项:

      -l 只统计行数

      -w 只统计单词数

      -m 只统计字符数

 

四,条件判断

  1,按照文件类型进行判断

    -d 文件  判断该文件是否存在,并且是否为目录文件(是目录为真)

    -e 文件  判断该文件是否存在(存在为真)

    -f 文件  判断该文件是否存在,并且是否为普通文件(是普通文件为真)

    -L 文件  判断该文件是否存在,并且是否为符号链接文件(是符号链接文件为真)

    例如:

      test -e student.txt

      echo $?

      [ -e student.txt]

      [ -d /root ] && echo "yes" || echo "no"

  2,按照文件权限进行判断

    -r 文件  判断该文件是否存在,并且是否该文件拥有读权限

    -w 文件  判断该文件是否存在,并且是否该文件拥有写权限

    -x 文件  判断该文件是否存在,并且是否该文件拥有执行权限

    test -w student.txt && echo "yes" || echo "no"

  3,两个文件之间进行比较

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

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

    文件1 -ef 文件2  判断文件1是否和文件2的Inode号一致,可以理解为两个文件是否为同一个文件

  4,两个整数之间的比较

    整数1 -eq 整数2  判断整数1是否和整数2相等(相等为真)

    整数1 -ne 整数2  判断整数1是否和整数2不相等(不相等为真)

  5,字符串判断

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

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

    字符串1 == 字符串2  判断字符串是否相等

    字符串1 != 字符串2  判断字符串是否不等

  6,多重条件判断

    判断1 -a 判断2  逻辑与,判断1和判断2都成立,为真

    判断1 -o 判断2  逻辑或,判断1和判断2其一成立,为真

    !判断  逻辑非,判断为假的时候 ,!判断为真

 

五,流程控制

  1,if语句

    1,单分支if条件语句

      if 【条件判断式】;then

        程序

      fi

    或者

      if 【条件判断式】

        then 

          程序

      fi

    单分支条件语句需要注意几个点:

      1,if语句使用fi结尾和一般语言使用大括号结尾不同

      2,【条件判断式】就是使用test命令判断,所以中括号和判断式之间必须有空格

      3,then后面跟符合条件之后执行的程序,可以放在[]之后,用";"分割,也可以换行写入,就不需要";"了

    判断分区使用率

     

    #!/bin/bash

    rate=$( df -h | grep "/dev/sda1" | awk '{print $5}' | cut -d "%" -f 1)
    if [ $rate -ge 80 ];then
      echo "warning ! /dev/sda1 is full!"
    if
    echo "check end"

 

    2,双分支if条件语句

      if【条件判断式】

        then 

          条件成立时执行的程序

      else

          条件不成立时执行的程序

      fi

    

    3,多分支if条件语句

      if 【条件判断式1】

        then 

          当条件判断式1成立时执行程序1

      elif【条件判断式2】

        then

          当条件判断式2成立时执行程序2

      else

        当所有条件不成立时,最后执行此程序

      fi

  

  2,case语句

    多分支case条件语句

    case语句和if...elif..else语句一样都是多分支条件语句,不过和if多分支条件语句不同的是,case语句只能判断一种条件关系,而if语句可以判断多种条件关系

    case $变量名 in

      "值1")

        如果变量的值等于值1,则执行程序1

        ;;

      "值2")

        如果变量的值等于值2,则执行程序2

        ;;

      *)

        如果变量的值都不是以上的值,则执行该程序

        ;;

    esac

  3,for循环

    语法一:

      for 变量 in 值1 值2 值3

        do

          程序

        done

    

    语法二:

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

        do

          程序

        done

  4,while循环与until循环

    1,while循环

      while循环是不定循环,也称作条件循环,只要条件判断式成立,循环就会一直继续,直到条件判断式不成立,循环才会停止,这就和for的固定循环不太一样

      while 【条件判断式】

        do

          程序

        done

    2,until 循环

      until循环和while循环相反,until循环时只要条件判断式不成立则进行循环,并执行循环程序。一旦循环条件成立,则终止循环

      until 【条件判断式】

        do

          程序

        done

      

posted @ 2020-02-14 17:16  春告鳥  阅读(216)  评论(0编辑  收藏  举报