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

    

相关推荐