• linux学习20 运维核心技能-grep命令与基本正则表达式


    一、回顾

      1、bash的特性:hash,变量

        命令hash:hash命令

        变量:

          本地变量,环境变量,局部变量

          位置参数变量,特殊变量

          变量赋值:name=value,export name=value,declare -x name=value

          变量引用:$name,${name}

          变量撤销:unset name

      2、bash脚本编程,运行脚本

        #!/bin/bash

        #

      3、bash的配置文件

        profile类:登陆式shell

        bashrc类:非登录式shell

        登录式shell: /etc/profile --> /etc/profile.d/* --> ~/.bash_profile --> ~/.bashrc --> /etc/bashrc

        非登录式shell:~/.bashrc --> /etc/bashrc --> /etc/profile.d/*.sh 

    二、文本处理工具

      1、Linux上文本处理三剑客

        a、grep:文本过滤工具(模式:pattern)工具。

        b、sed:stream editor,流编辑器;文本编辑工具;

        c、awk:Linux上的实现为gawk,文本报告生成器(格式化文本);

      2、正则表达式:Regual Expression,REGEXP

        a、由一类特殊字符及文本字符所编写的模式,其中有些字符不表示其字面意义,而是用于表示控制或通配的功能;

        b、基本正则表达式:BRE

        c、扩展正则表达式:ERE

        d、元字符

    三、文本处理工具之grep

      1、grep:Global search REgular expression and Print out the line。

        作用:文本搜索工具,根据用户指定的"模式(过滤条件)"对目标文本逐个进行匹配检查;打印匹配到的行;

        模式:由正则表达式的元字符及文本字符所编写出的过滤条件;

      2、正则表达式引擎:

        grep [OPTIONS] PATTERN [FILE]

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

      3、常见选项

        --color=auto:对匹配到的文本着色后高亮显示

        -i: Ignorecase:忽略字符的大小写

        -o:仅显示匹配到的字符串本身

        -v:--Invert-match:显示不能被模式匹配到的行

        -E:支持使用扩展的正则表达式元字符

        -q:--quiet,silent:静默模式,即不输出任何信息

    [root@node1 ~]# grep -q UUID /etc/fstab 
    [root@node1 ~]# echo $?
    0
    [root@node1 ~]# grep -q UUIID /etc/fstab 
    [root@node1 ~]# echo $?
    1

        -A #:after,即显示匹配到的和后两行

    [root@node1 ~]# grep -A 2 "root" /etc/passwd
    root:x:0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    --
    operator:x:11:0:operator:/root:/sbin/nologin
    games:x:12:100:games:/usr/games:/sbin/nologin
    ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

        -B #:before,即显示匹配到的和前两行

    [root@node1 ~]# grep -B 2 "root" /etc/passwd
    root:x:0:0:root:/root:/bin/bash
    --
    halt:x:7:0:halt:/sbin:/sbin/halt
    mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    operator:x:11:0:operator:/root:/sbin/nologin

        -C #:显示前后各两行

    [root@node1 ~]# grep -C 2 "root" /etc/passwd
    root:x:0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    --
    halt:x:7:0:halt:/sbin:/sbin/halt
    mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    operator:x:11:0:operator:/root:/sbin/nologin
    games:x:12:100:games:/usr/games:/sbin/nologin
    ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

      4、基本正则表达式元字符

        a、字符匹配

          .:匹配任意单个字符

    [root@node1 ~]# grep "r..t" /etc/passwd
    root:x:0:0:root:/root:/bin/bash
    operator:x:11:0:operator:/root:/sbin/nologin
    ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
    tomcat:x:53:53:Apache Tomcat:/usr/share/tomcat:/sbin/nologin

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

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

            [:dlgit:]、[:lower:]、[:upper:]、[:alpha:]、[:alnum:]、[:punct:]、[:space:]

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

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

              例如:grep "x*y"

                abxy:可以匹配到

                aby:可以匹配到

                xxxxxy:可以匹配到

                yab:可以匹配到

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

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

    [root@node1 ~]# grep "x*y" grep.txt 
    abxy
    aby
    xxxxxy
    yab
    [root@node1 ~]# grep "x?y" grep.txt 
    abxy
    aby
    xxxxxy
    yab

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

    [root@node1 ~]# grep "x+y" grep.txt 
    abxy
    xxxxxy

            {m}:匹配前面字符m次

    [root@node1 ~]# grep "x{1}y" grep.txt 
    abxy
    xxxxxy
    [root@node1 ~]# grep "x{2}y" grep.txt 
    xxxxxy

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

    [root@node1 ~]# grep "x{2,5}y" grep.txt 
    xxxxxy

              {0,n}:至多n次

              {m,}:至少m此

        c、位置锚定

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

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

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

            ^$:空白行;

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

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

            <或:词首锚定,用于单词模式的左侧

    [root@localhost ~]# grep "<root" /etc/passwd
    root:x:0:0:root:/root:/bin/bash
    operator:x:11:0:operator:/root:/sbin/nologin

            >或:词尾锚定,用于单词模式的右侧

    [root@localhost ~]# grep "root>" /etc/passwd
    root:x:0:0:root:/root:/bin/bash
    operator:x:11:0:operator:/root:/sbin/nologin

            <PATERN>:匹配完整单词

    [root@localhost ~]# grep "<root>" /etc/passwd
    root:x:0:0:root:/root:/bin/bash
    operator:x:11:0:operator:/root:/sbin/nologin

          练习:

            1、显示/etc/passwd文件中不以/bin/bash结尾的行

    [root@localhost ~]# grep -v "/bin/bash$" /etc/passwd

            2、找出/etc/passwd文件中两位数或三位数(即锚定以数字开头和结尾并且出现两到三次)

    [root@localhost ~]# grep "<[0-9]{2,3}>" /etc/passwd

            3、找出/etc/rc.d/rc.sysinit或/etc/grub2.cfg文件中,以至少一个空白字符开头,且后面非空白字符的行

    [root@localhost ~]# grep "^[[:space:]]+[^[:space:]]" /etc/grub2.cfg

            4、找出netstat -tan命令的结果中以LISTEN后跟0、1或多个空白字符结尾的行

    [root@localhost ~]# netstat -tan|grep "LISTEN[[:space:]]*$"
    tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN     
    tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN     
    tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN     
    tcp6       0      0 :::111                  :::*                    LISTEN     
    tcp6       0      0 :::22                   :::*                    LISTEN     
    tcp6       0      0 ::1:25                  :::*                    LISTEN  

        d、分组及引用

          ():将一个或多个字符捆绑在一起,当作一个整体进行处理

            (xy)*ab:表示xy出现0次,一次或多次然后再匹配ab

          注意:分组括号中的模式匹配到的内容会被正则表达式引擎自动记录于内部的变量中,这些变量为:

            1:模式从左侧起,第一个左括号以及与之匹配的右括号之间的模式所匹配到的字符

            2:模式从左侧起,第二个左括号以及与之匹配的右括号之间的模式所匹配到的字符

            3...

    [root@localhost ~]# grep "l..e.*l..e" lovers.txt 
    He likes his lover
    He loves his lover
    She likes her liker
    She loves her liker
    [root@localhost ~]# grep "(l..e).*1" lovers.txt 
    He loves his lover
    She likes her liker
    [root@localhost ~]# grep "r..t" /etc/passwd
    root:x:0:0:root:/root:/bin/bash
    operator:x:11:0:operator:/root:/sbin/nologin
    ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
    [root@localhost ~]# grep "^(r..t).*1" /etc/passwd
    root:x:0:0:root:/root:/bin/bash

          后向引用:引用前面的分组括号中的模式所匹配到的字符。

  • 相关阅读:
    前端开发拥有属于自己的云服务器能做什么?
    C语言编译、链接和运行详解
    C程序运行机制概述
    Java之顺序查找
    C语言注释
    C转义字符
    Java之二维数组基本使用
    Java之类与对象基本使用
    分享些发表技术类文章的平台
    解决蓝奏云链接无法访问问题
  • 原文地址:https://www.cnblogs.com/Presley-lpc/p/12092552.html
Copyright © 2020-2023  润新知