• 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 " " $6 " "}' student.txt

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

        hint :print 会自动加换行符

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

        例如:

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

        

        awk中的BEGIN

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

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

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

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

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

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

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

        awk中的关系运算符:

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

      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

          

  • 相关阅读:
    20155239 2016-2017-2 《Java程序设计》第5周学习总结
    学习Java的必要知识点记录
    # 20155226 2016-2017-2 《Java程序设计》第4周学习总结
    随笔三 第三周学习
    第二周学习
    吕宇轩20155239 第一周
    随笔三 安装Linux操作系统
    随笔二
    随笔一
    java动态代理(JDK和cglib)
  • 原文地址:https://www.cnblogs.com/Cl0ud/p/12308143.html
Copyright © 2020-2023  润新知