笔者最近在使用shell脚本中处理字符串,因此使用了大量shell脚本中的四剑客(awk,grep,sed,cut)而其中使用最多的两种方法就是grep和awk,因此想总结整理一下。

  一、grep的意义

  二、grep的基本用法

  三、awk的意义

  四、awk的基本用法

  五、实例说明两者怎么用

  一、grep的意义

    首先,grep是用来处理行数据的基本命令集,简单来说它的使用意义就在于当你想要找到某个文件中的某个字符串以及它相关联的信息时(比如说行数),那么你就需要这个命令了。

  二、grep的基本用法

     grep使用的格式为   grep  [参数]   "模式"   文件 

   (1)grep的作用域

     grep的作用域主要是由最后一个参数文件所决定的,换句话说,如果决定在某个文件中查找字符串,那么直接在后面书写某个文件即可,而如果在某个文件夹,那么要做两件事:1、首先需要在参数中加 -r(表示递归的意思)。2、在文件参数上加上文件夹。

     例如:假设一个文件夹git_reverse目录中包含一个文件,文件夹中含有文件1.txt,而1.txt中包含字符串66666666,如果现在要搜索字符串6666666666,那么有以下两种方法:

     1、grep  NULL   "66666666666" (单引号,双引号,不加引号)   1.txt 

        2、grep    -r       "66666666666"(单引号,双引号,不加引号) git_reverse

    无论是哪一种都可以。       

   (2)grep的参数

      grep的参数是grep当中的最大难点,也是不太容易记得部分,我觉得在这里我们可以按照由大到小的顺序来进行记忆:

      1、首先从最大的进行记忆:是否查找改行前后的n行。此时可以使用

        -A(after):表示匹配之后的第n行。

        -B(before):表示匹配之前的第n行。

        -C(context):表示匹配之前和之后的第n行。

      2、接着我们要判断是不是需要行数:

        -n(num):表示判断当前是否有行数

      3、接着我们就要判断字符串本身了。同样由大到小进行排列:

        1、首先我们要判断它是否忽略大小写:

          -i(ignore):忽略大小写

        2、接着我们判断是否只匹配该字符串和不匹配相关的字符串

          -o(output):判断只输出这个

          -v(verse):判断不输出这个

        3、接着我们可以设置其是否高亮:

          --color:颜色

 

      (3)grep的模式匹配

       好了,搞清楚这些我们就应该开始研究grep里面仅剩的一个参数“模式”的问题了。其实模式的话主要可以分成两个部分:第一个的话就是固定模式,换句话说就是你知道相应的字符串,比如我们要搜索某个文件中的6666666这个字符串,那么我们就直接用grep “66666666” 文件就可以了。

      看到这里你可能会有一个疑问,那就是grep的引号和shell脚本中用法是一样的吗?好的,这里我们要说一下grep中引号的用法。首先,我们要知道grep中单引号,双引号和不加引号三种方法。首先要明确的一点是:这三种方式在一定程度上是可以转换使用的。比如上面我搜索的666666666,无论是单引号和双引号都是可以的。因此我们这里主要谈一下三者的区别。

      首先说一下加引号(单引号和双引号都算上)和不加引号的区别。这个主要应用于空格上面。换句话说如果你搜索的文本中包含空格,那么你就必须加引号。(这个应该也比较好理解,因为grep命令是默认过滤空格的)。

      接着我们说一下单引号和双引号。这个的用法和shell脚本基本相同,也就是说如果我们定义一个a=“var”,那么我们要搜索这个var这个字符串,就必须用“$a”,而如果我们使用了'$a',那么我们搜索出来的结果就是$a,这是因为$符本身就是系统保留字,系统是识别这个字的,但是如果换一个字,比如^,这个字符系统是不认的,那么它单引号和双引号是一样的。

      好了,回到之前的话题,如果我们我知道我们具体要搜索哪个字符,只是知道一个搜索字符的大致范围该怎么办呢?那么这里我们就要用到正则表达式了。

     正则表达式可以分成两个部分,一个是确定字符的位置关系,还有一个是确定字符的出现数量和范围。

    (1)位置关系

      确定正则表达式的位置关系有两个,一个是^(表示以.......开头),用法为t^,表示匹配以t为开头的用法。另一个是以$(表示以.........结尾),用法为t$(正则表达式都是匹配前面的)。

    (2)数量关系

      这里主要说两个字符,一个是*,它表示之前的字符从0次到无数次,比如比如,zo*可以匹配z或者zoo,另外还有一个就是.,他就是占位符,他会显示本身可以匹配任何字符。例如:zo.可以匹配zoe,zor等等。另外还有一个符号就是{,可以用来匹配出现的个数,比如o{2,}就可以表示o出现两次的问题。

    (3)匹配范围

      这里主要介绍一下[符号,它表示里面的内容范围,比如如果我们要匹配字母,可以这样[a-z],同理如果我们要匹配数字,可以写[0-9]等等。

   (4)和其他命令的合用

      grep可以和很多命令合用,只要你想抓取数据信息,你就可以用grep。比如cat XXX | grep XXX 

 

    总结一下,本篇文章一共介绍了4个部分:

    (1)介绍了grep命令的使用场景,简单来说就是查找文件中的字符串使用。

    (2)介绍了grep命令输出字符串的相关参数的作用。简单来说就是控制字符串的作用域,行数,大小写,以及前后部分输出

    (3)介绍了grep命令中单引号,双引号,不加引号的区别。简单来说单引号和双引号区别就是可不可以替换,加不加引号区别在于你要查找的字符串前后是否有空格。

    (4)介绍了grep命令中常用的正则表达式。按照位置有^和$,按照数量有"*"和".",按照匹配范围有[]。

    今天就先写道这,下次写awk命令。