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

一、正则表达式

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语句,如图

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值