sed及grep用法详解

linux系统有被称为文本处理三剑客grepsedawk.

        今天与大家分享的就是gerpsed处理工具,至于awk,我将会在晚些的时间与大家分享,在分享grepsed之前我先要和大家说说正则表达,正则表达是什么呢,正则表达式就像是三剑客手里的剑,没有剑哪还能称的上什么剑客,所以我们要先了解以下正则表达式的简单用法。

什么是正则表达式:

        “正则表达式是描述一组字符串特征的模式,用来匹配特定的字符串。“--Ken Thompson

基本正则表达式的元字符有以下这些:

    . :匹配任意单个字符;

    []:匹配指定范围内的任意单个字符;

      如:[a-z], [A-Z], [0-9], [a-z0-9]

       [:upper:]:所有大写字母

       [:lower:]:所有小写字母

       [:alpha:]:所有字母

       [:digit:]:所有数字

       [:alnum:]:所有的字母和数字

       [:space:]:所有空白字符

       [:punct:]:所有标点符号

       [^]:匹配指定范围外的任意单个字符;

匹配次数:用在要指定其出现的次数的字符的后面,用于限制其前面字符出现的次数;默认工作于贪婪模式;

    *:匹配其前面的字符任意次;0,1,多次;

    .*:匹配任意长度的任意字符

    \?:匹配其前面的字符0次或1次;即其前面的字符是可有可无的;

    \+:匹配其前面的字符1次或多次;即其面的字符要出现至少1次;

    \{m\}:匹配其前面的字符m次;

    \{m,n\}:匹配其前面的字符至少m次,至多n次;

    \{0,n\}:至多n

    \{m,\}:至少m

位置锚定:

    ^:行首锚定;用于模式的最左侧;

    $:行尾锚定;用于模式的最右侧;

    ^PATTERN$:用于PATTERN来匹配整行;

    ^$:表示空白行;

    ^[[:space:]]*$:空行或包含空白字符的行;

    单词:非特殊字符组成的连续字符(字符串)都称为单词;

    \< \b:词首锚定,用於单词模式的左侧;

    \> \b:词尾锚定,用於单词模式的右侧;

    \<PATTERN\>:匹配完整单词;

        好的现在可以介绍grepsed了,grepglobal searchregular expression(RE) and print out the line的缩写,光看名字这么长就知道这是一个很厉害的工具,嘿嘿,其实它能做到对用户所选择的过滤条件全文搜索匹配指定文件,并把相应的行显示出来,并且显示的是整行。也就是说只要有部分匹配就会整行显示。这个过滤条件可以是基本正则表达式或扩展正则表达式。正则表达式我也将会在晚些的博客中与大家分享。

grep的用法

      grep[OPTIONS] PATTERN [FILE]...

      grep[OPTIONS] [-e PATTERN | -f FILE] [FILE...]

这里的PATTERN就是过滤条件,加上-e参数后就可以匹配多个条件,后面的-f表示过滤条件可以从文件中读取。

PATTERN:可以是由正则表达式的元字符及文本字符所编写出的过滤条件。

 wKiom1Z-jgmjaqpnAAAXtvG7VVM790.png

常用选项如下:

      --color=[always|never|auto]:对提配到的文本是否高亮显示;

      -iignore-case,忽略字符大小写;

      -o:仅显示匹配到的字符串本身,而不整行显示;

      -v:显示能被匹配字符所在的行以外的所有行;

      -E:支持扩展的正则表达式;

      -q:静默模式,即匹配到字符,但不显示,一般用来判断文件是否存在;    

      -Anumnum用数字替换,表示显示匹配到的字符所在的行及后num行;   -Bnumnum用数字替换,表示显示匹配到的字符所在的行及前num行:

      -Cnumnum用数字替换,表示显示匹配到的字符所在的行及前后各num行:

以下以-A选项为例:

                            wKiom1Z-jk6S16XsAAAuikHAcQA040.png

grep需要和正则表达是才能发挥出威力,例如下面:

wKiom1Z-jomyN4qQAAAOeI8P2Xk028.png

例一:显示/etc/passwd文件中以/bin/bash结尾的行;

 

wKioL1Z-jubSqg2qAAAPxqfFvv8448.png

例二:显示netstat -tan命令的结果中以LISTEN后跟01或多个空白字符结尾的行

 

wKiom1Z-ju6QEnU0AAAUoWZ9dTc707.png

例三:显示/etc/grub2.cfg文件中,以至少一个空白字符开头,且为数字结尾的行。


        grep的用法就说这么多,基于正则表式还能组合出更多的用法,就大家研究去喽,下面该说说sed了。

三剑客之sed


     sed是一个行编辑器,通常sed编辑文件都不是直接编辑原文件的,而是将原文件复制一份在内存中进行编辑,在sed启动后内存空间中有一段空间pattern spacehold spacepattern space对复制来的文件进行逐行匹配,能被匹配到的我们就可以做指定编辑,sed可以对符合条件的行逐行编辑操作,也可以只对符合条件的部分进行编辑操作,处理完之后结果可以传送到stdout(标准输出),当然也可以选择删除,还可以选择存放到hold space中,不能匹配到的可以选择是否传送到标准输出。

关于sed用法:

      sed[OPTIONS] ...’script’ [input-file]...

           script:地址定界编辑命令,即对哪些文本,做什么样操作,注意地址定界和编辑命令之间没有空格。

注意:不论是否被patternspace匹配到,默认情况下原文件都会被输出到标准输出。

wKioL1Z-j02TMoApAAALe0p-_eY427.png为了测试我建立了这样一个文本。

常用选项:

      -n:不输出模式空间中的内容至屏幕;

      -escript, --expression=script:多点编辑;

      -f  /PATH/TO/SED_SCRIPT_FILE

           每行一个编辑命令,多个命令组成的文件叫做脚本文件

      -r,--regexp-extended:支持使用扩展正则表达式;

      -i[SUFFIX],--in-place[=SUFFIX]:直接编辑原文件


wKiom1Z-j4WCW9oQAAAHqdYVnok207.png

表示删除test1文件行首为12位数字开头后面跟一个符号,并只显示删除后行中有cd字母的行。

 

地址定界:

(1)  空地址:对全文进行处理;

wKioL1Z-j8XyVGKuAAAMG3F0Ej4653.png

       (2) 单地址:

           #:指定行;

            /pattern/:被此模式所匹配到的每一行;

       (3) 地址范围

           #,#

           #,+#

           #/pat1/

           /pat1/,/pat2/

           $:最后一行;

       (4) 步进:左边数字为其实行,右边数字为步长,即每次匹配加几行如:1~2表示所有的奇数行。

      wKiom1Z-kBqBlI7BAAAIJH6hTB8309.png

编辑命令:

      d:删除匹配模式匹配到的行;

      wKioL1Z-kFHzHTbKAAALdEWVhB8108.png

      p:显示模式空间中的内容;

      wKiom1Z-kPjg4oLlAAANGWs5h4o743.png这里第五行被显示了两遍,因为默认情况下pattern space空间中的内容也是会被输出的,-p之后又会被显示一遍,所以这里出现了两次第五行的内容。

      a  \text:在行后面追加文本“text”,支持使用\n实现多行追加;

         wKiom1Z-kFPBABijAAAQ9zi0R1k670.png

      i  \text:在行前面插入文本“text”,支持使用\n实现多行插入;

      c  \text:把匹配到的行替换为此处指定的文本“text”;

      w/PATH/TO/SOMEFILE:保存模式空间匹配到的行至指定的文件中;

      r  /PATH/FROM/SOMEFILE:读取指定文件的内容至当前文件被模式匹配到的行后面;文件合并;

      wKiom1Z-kTOz2P7-AAAOy3xhPIU784.pngtest2文件中存放的就是wKioL1Z-kYHx-PcrAAACPM38J_A080.png

      =:为模式匹配到的行打印行号;

      !:条件取反;

地址定界!编辑命令;

      s///:查找替换,其分隔符可自行指定,常用的有s@@@, s###等;

替换标记:

            g:全局替换;

            w /PATH/TO/SOMEFILE:将替换成功的结果保存至指定文件中;

            p:显示替换成功的行;

      wKiom1Z-kY_iQdrOAAAGBRGkk5E376.png

高级编辑命令:

h:把模式空间中的内容覆盖至保持空间中;

H:把模式空间中的内容追加至保持空间中;

g:把保持空间中的内容覆盖至模式空间中;

G:把保持空间中的内容追加至模式空间中;

x:把模式空间中的内容与保持空间中的内容互换;

n:覆盖读取匹配到的行的下一行至模式空间中;

N:追加读取匹配到的行的下一行至模式空间中;

d:删除模式空间中的行;

D:删除多行模式空间中的所有行;

有兴趣的可以自行研究研究。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章