文本三剑客grep,awk,sed及正则表达式详解

    xiaoxiao2022-07-04  191

    一、正则表达式

    1、正则表达式和通配符的区别(正则表达式用来在文件中匹配符合条件的字符串,通配符用来匹配符合条件的文件名)吗?其实这种区别只在Shell当中适用,因为用来在文件当中搜索字符串的命令,如grep、awk、sed等命令可以支持正则表达式,而在系统当中搜索文件的命令,如ls、find、cp这些命令不支持正则表达式,所以只能使用shell自己的通配符来进行匹配了。

    2 基础正则表达式

    特殊:“^$”则会匹配空白行,

    3.扩展正则表达式

        熟悉正则表达式的童鞋应该很疑惑,在正则表达式中应该还可以支持一些元字符,比如“+”“ ? ”“|”“()”。其实Linux是支持这些  元字符的,只是grep命令默认不支持而已。如果要想支持这些元字符,必须使用egrep命令或grep -E选项,所以我们又把这些元字符称作扩展元字符。如果查询grep的帮助,对egrep的说明就是和grep -E选项一样的命令,所以我们可以把两个命令当做别名来对待。

    二、字符截取和替换命令

    注意:cut命令的默认分隔符是制表符,也就是“tab”键,不过对空格符可是不支持的。如果想要提取多列,只要列号直接用“,”分开。

    三.awk编程

    1,printf格式化输出

    2.awk的基本使用

    3.awk的条件

    4.   BEGIN是awk的保留字,是一种特殊的条件类型。BEGIN的执行时机是“在awk程序一开始时,尚未读取任何数据之前执行”。一旦BEGIN后的动作执行一次,当awk开始从文件中读入数据,BEGIN的条件就不再成立,所以BEGIN定义的动作只能被执行一次。

    5.  END也是awk保留字,不过刚好和BEGIN相反。END是在awk程序处理完所有数据,即将结束时执行。END后的动作只在程序结束时执行一次。

    6.注意:虽然awk是列提取命令,但是也要按行来读入的。如果有BEGIN条件,则先执行BEGIN定义的动作 ;如果没有BEGIN条件,则读入第一行,把第一行的数据依次赋予$0、$1、$2等变量。其中$0代表此行的整体数据,$1代表第一字段,$2代表第二字段。 依据条件类型判断动作是否执行。如果条件符合,则执行动作,否则读入下一行数据。如果没有条件,则每行都执行动作。要想让awk识别字符串,必须使用“//”包含。

    7.awk内置变量

    在awk编程中,因为命令语句非常长,在输入格式时需要注意以下内容:多个条件{动作}可以用空格分割,也可以用回车分割。在一个动作中,如果需要执行多个命令,需要用“;”分割,或用回车分割。在awk中,变量的赋值与调用都不需要加入“$”符。条件中判断两个值是否相同,请使用“==”,以便和变量赋值进行区分。

    8.awk函数的定义方法如下:function  函数名(参数列表){ 函数体} 

    四。sed命令

     概述:sed主要是用来将数据进行选取、替换、删除、新增的命令。sed所做的修改并不会直接改变文件的内容(如果是用管道符接收的命令的输出,这种情况连文件都没有),而是把修改结果只显示到屏幕上,除非使用“-i”选项才会直接修改文件。

    五。字符处理命令

     1、sort排序命令

    2. uniq

          uniq命令是用来取消重复行的命令,其实和“sort -u”选项是一样的。

      格式:      uniq [选项] 文件名选项: -i:忽略大小写

    3 .统计命令wc

        wc  [选项]  文件名

                选项: -l:只统计行数 -w:只统计单词数 -m:只统计字符数

    六.条件判断

     1,按照文件类型判断

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

    3.两个文件之间的比较

    4.两个整数之间的比较

    5.字符串的判断

    6.多重条件判断

    七.流程控制

    1 if条件判断

    1)、单分支if条件语句单分支条件语句最为简单,就是只有一个判断条件,如果符合条件则执行某个程序,否则什么事情都不做。

        语法如下:

               if  [   条件判断式   ];  then

                  程序

              fi

    单分支条件语句需要注意几个点:if语句使用fi结尾,和一般语言使用大括号结尾不同[ 条件判断式 ]就是使用test命令判断,所以中括号和条件判断式之间必须有空格then后面跟 符合条件之后执行的程序,可以放在[]之后,用“;”分割。也可以换行写入,就不需要“;”了,比如单分支if语句还可以这样写:

              if [ 条件判断式 ]

                then

                     程序

             fi

    2、双分支if条件语句

                     if [    条件判断式   ]

                        then

                            条件成立时,执行的程序

                        else

                            条件不成立时,执行的另一个程序

                           fi

    3、多分支if条件语句

    if [  条件判断式1  ]

        then

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

        elif [  条件判断式2  ]

        then

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

       elif[  条件判断3  ]

         then

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

    ...省略更多条件...

       else 

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

    fi

    4.多分支case条件语句

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

     case $变量名 in

       "值1")

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

            ;;

        "值2")

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

         ::

          ...省略其他分支...

          *)

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

        ;;

      esac

    这个语句需要注意以下内容:case语句,会取出变量中的值,然后与语句体中的值逐一比较。如果数值符合,则执行对应的程序,如果数值不符,则依次比较下一个值。如果所有的值都不符合,则执行“*)”(“*”代表所有其他值)中的程序。

    case语句以“case”开头,以“esac”结尾。每一个分支程序之后要通过“;;”双分号结尾,代表该程序段结束(千万不要忘记,每次写case语句,都不要忘记双分号;;)。

    5.for循环

      for循环是固定循环,也就是在循环时已经知道需要进行几次的循环,有时也把for循环称为计数循环。for的语法有如下两种

    语法一:

         for 变量 in值1  值2  值3...

               do

                    程序

         done

    这种语法中for循环的次数,取决于in后面值的个数(空格分隔),有几个值就循环几次,并且每次循环都把值赋予变量。也就是说,假设in后面有三个值,for会循环三次,第一次循环会把值1赋予变量,第二次循环会把值2赋予变量,以此类推。

    语法二:

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

              do

                 程序

          done

    语法二中需要注意:初始值:在循环开始时,需要给某个变量赋予初始值,如i=1;循环控制条件:用于指定变量循环的次数,如i<=100,则只要i的值小于等于100,循环就会继续;变量变化:每次循环之后,变量该如何变化,如i=i+1。代表每次循环之后,变量i的值都加1。

    6,while循环

           while [  条件判断式  ]

              do

                  程序

             done

    对while循环来讲,只要条件判断式成立,循环就会一直继续,直到条件判断式不成立,循环才会停止。

    7.until循环

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

           until [  条件判断式  ]

                do

                   程序

            done

    8.函数

         function  函数名  ()  {

                    程序

       }

    8.特殊流程控制语句

       1、 exit语句

          系统是有exit命令的,用于退出当前用户的登录状态。可是在Shell脚本中,exit语句是用来退出当前脚本的。也就是说,在Shell脚本中,只要碰到了exit语句,后续的程序就不再执行,而直接退出脚本。exit的语法如下:

            exit [返回值]

     如果exit命令之后定义了返回值,那么这个脚本执行之后的返回值就是我们自己定义的返回值。可以通过查询$?这个变量,来查看返回值。如果exit之后没有定义返回值,脚本执行之后的返回值是执行exit语句之前,最后执行的一条命令的返回值。

      2.、 break语句

         当程序执行到break语句时,会结束整个当前循环。而continue语句也是结束循环的语句,不过continue语句单次当前循环,而下次循环会继续。画个示意图解释下break语句,如图

       

    3.continue语句

         continue也是结束流程控制的语句。如果在循环中,continue语句只会结束单次当前循环,也画个示意图来说明下continue语句,如图

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    最新回复(0)