• linux三剑客之grep


        

    linux基础三剑客之grep

    1、grep命令

    基本介绍

      grep命令是文本本过滤工具,是基于一个模式匹配文件的每一行,grep分类:egrepfgrep

      grep英文名:Global  search  Regular  expression  and  Print  out  the  line

      grep命令的作用:文本所搜工具。根据用户指定的模式对目标文件逐行进行匹配检查,并且打印匹配的行

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

      正则表达式:英文名regular  expression,解释:由一类特殊字符及文本字符所编写的模式,其中有些字符不表示字符字面意义,而表示控制或者通配的功能

      正则表达式分类

        基本正则表达式:basic  regular  expression,简写BRE

        扩展正则表达式:extend regular  expression,简写ERE

        注意:grep默认支持的是基本正则表达式,但是grep命令可以是用选项-E来使用扩展正则表达式。egrep命令默认支持扩展正则表达式

      正则表达式引擎:检查一个模式是否匹配一段文本信息的程序,不同的编程语言使用的正则表达式引擎可能不同。引擎不同,检查字符匹配的算法不同。

      grep命令内部自带了正则表达式引擎来实现文本的检查

      基本语法

         grep [OPTIONS] PATTERN [FILE...]

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

          常用选项

            --color-auto:对匹配的文本内容进行着色

            -v:显示不能够被pattern匹配的行

            -i:忽略字符大小写

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

            -q:对匹配或者不匹配的内容不输出任何信息,表示是静默模式

            -A  num:显示匹配到的行及在这之后多显示num

            -B  num:显示匹配到的行及在这之前多显示num

            -C  num:显示匹配到的行及在这之前和之后显示num

            -E:使用扩展正则表达式

            -F:使用固定字符正则表达式

            -G:表示使用基本正则表达式

            -P:表示使用perl正则表达式

      基本正则表达式的元字符

        字符匹配元字符

          .:匹配任意单个字符

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

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

          也支持字符集范围表示

          [:digit:][:alnum:][:alpha:][:lower:][:upper:][:punct:]

            使用案例

    [root@oldboy ~]# grep "^[[:alpha:]].[[:alpha:]]$" a.txt
    
    hal
    
    kde
    
    lvm
    
    ntp
    
    opt
    
    pki
    
    ppp
    
    rpc
    
    rpm
    
    ssh
    
    ssl
    
    xdg
    
    xml
    
    yum
    
    qwe

        匹配次数元字符

          基本介绍

            用在要指定次数的字符后边,用于指定前面的字符要出现的次数

        匹配次数元字符

          *:匹配前面的字符0次或者多次

          使用案例

    [root@oldboy ~]# grep "x*y" grep.txt
    xay
    xbby 

          ?:匹配前面的字符0次或者1

    .      *:匹配任意长度字符

          +:匹配前面字符至少一次

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

          {m,n}:匹配掐面字符至少m次,至多n

            {m,}:匹配前面字符至少m次,多则不限

            {0,n}:匹配前面的字符至多n

            使用注意

              为什么要使用?-----因为?问号、加号+、大括号{}linuxbash解释器中有特殊意义,用反斜线在意就让他表示?问号原来的意义,即?问号在bash中表示任意字符,{}大括号在bash中表示内容展开,因此为了避免在bash中被解释,那么使用反斜线转义

        位置锚定元字符

          基本介绍

            要求指定的字符串模式必须出现在特定位置,那么得使用位置锚定元字符

          位置锚定元字符有

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

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

            ^PATTERN$:用于模式匹配整行

            ^$:匹配空行

              ^[[:space:]]*$:匹配整行为空格行或者空行

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

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

            <PATTERN>:单词锚定,用于匹配整个单词

        分组

          ():用于将一个后者多个字符串捆绑在一起,当做一个整体进行处理,小括号在bash中也表示特殊符号

          后项引用:引用前面的分组括号中的模式所有匹配的字符(并不是引用匹配的模式,而是引用的匹配模式下的字符串)

          案例演示:

    [root@oldboy ~]# grep "(<[[:alpha:]]{1,3}t>).*1" /etc/passwd
    
    root:x:0:0:root:/root:/bin/bash
    
    halt:x:7:0:halt:/sbin:/sbin/halt
    View Code

          使用注意:

            分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量的命名方式为:123...

            1:表示第一次被分组小括号所匹配的内容

            2:表示第二次被分组小括号所匹配的内容

            .....

            举例:

              (ab+(xy{2,}))*

                1匹配上面的:ab+(xy)

                2匹配上面的:xy{2,}

            使用注意

              grep命令默认使用的是贪婪模式匹配,即最大匹配。

          为什么要使用位置锚定符?

            grep正则匹配默认是每一行按照正则模式一个字符一个字符的匹配,那么有匹配的字符串可能出现在一行内容的任意位置,因此,如果我们有需求要匹配的字符串在指定的位置(比如:在行首、行尾、词首、词尾),那么就得使用位置锚定元字符

          单词:在linux正则表达式中表示由特殊符号分割的一个字符串,纯数字字符串也算一个单词(虽然在显示不算真正意义的单词)

        案例演示题库

          显示/proc/meminfo文件中以大小写ab开头的行

    [root@oldboy ~]# grep -i "^a" /proc/meminfo
    
    Active:            38640 kB
    
    Active(anon):      19756 kB
    
    Active(file):      18884 kB
    
    AnonPages:         19592 kB
    
    AnonHugePages:         0 kB
    
    [root@oldboy ~]# grep "^[aA].*" /proc/meminfo
    
    Active:            38612 kB
    
    Active(anon):      19720 kB
    
    Active(file):      18892 kB
    
    AnonPages:         19592 kB
    
    AnonHugePages:         0 kB
    
     
    View Code

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

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

          显示/etc/passwd文件中GID最大的用户名

    [root@oldboy ~]# sort -t: -k3 -n  /etc/passwd|tail -n 1
    
    www:x:515:518::/home/www2:/bin/bash
    
    [root@oldboy ~]# sort -t: -k3 -n  /etc/passwd|tail -n 1|cut -d: -f1
    
    www
    
     
    View Code

          显示/etc/passwdoldboy用户是否存在,如果存在显示他的默认shell

    [root@oldboy ~]# grep "^<oldboy>" /etc/passwd
    
    oldboy:x:500:515:lan:/home/oldboy:/bin/csh
    
    [root@oldboy ~]# grep "^<root>" /etc/passwd && grep "^<root>" /etc/passwd|cut -d: -f7
    
    root:x:0:0:root:/root:/bin/bash
    
    /bin/bash 
    View Code

          显示/etc/passwd文件中UID是三位数的用户名

    [root@oldboy ~]# grep "<[[:digit:]]{3}>" /etc/passwd
    
    [root@oldboy ~]# grep "<[[:digit:]]{3}>" /etc/passwd|cut -d: -f1
    
     
    View Code

          显示netstat  -tan中出现StateLISTEN的行

    [root@oldboy ~]# netstat -tan|grep "LISTEN[[:space:]]*"
    
    tcp     0      0 0.0.0.0:22           0.0.0.0:*                   LISTEN      
    
    tcp        0      0 127.0.0.1:631     0.0.0.0:*                   LISTEN      
    
    tcp        0      0 127.0.0.1:25      0.0.0.0:*                   LISTEN      
    
    tcp        0      0 :::22           :::*                        LISTEN      
    
    tcp        0      0 ::1:631            :::*                      LISTEN      
    View Code

          显示/etc/passwd文件中用户名与默认shell名相同的行

    [root@oldboy ~]# grep "(<[[:alnum:]]+>).*1$" /etc/passwd
    
    sync:x:5:0:sync:/sbin:/bin/sync
    
    shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
    
    halt:x:7:0:halt:/sbin:/sbin/halt
    
    bash:x:516:519::/home/bash:/bin/bash
    View Code

    2、egrep命令

    基本介绍

      扩展正则表达式

        egrep = egrep  -E

    基本语法

       grep [OPTIONS] PATTERN [FILE...]

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

      扩展正则表达式的元字符

        字符匹配

          .:匹配任意一个字符

          []:匹配范围内的字符

          [^]:匹配范围外的字符

        次数匹配

          *:匹配0次或者多次

          ?:匹配0次或者1

          +:匹配1次或者多次

          {m}:匹配m

          {m,n}:匹配至少m次,至多n

        锚定字符

          ^:锚定行首

          $:锚定行尾

          <:锚定词首

          >:锚定词尾

        分组

          ()

          后项引用变量123....

        或者

          a|b:支持二选一(扩展正则表达式比基本正则表达式元字符多了二选一)

      练习问题

        显示当前系统能够rootcentOS或者oldboy用户的默认shellUID

    [root@oldboy ~]# grep -E "^(root|centos|oldboy)>" /etc/passwd
    
    root:x:0:0:root:/root:/bin/bash
    
    oldboy:x:500:515:lan:/home/oldboy:/bin/csh
    View Code

        找出/etc/rc.d/init.d/functions文件中,某单词跟一个小括号的行

    [root@oldboy~]#egrep "^<[_[:alpha:]]+>[[:space:]]*()" /etc/rc.d/init.d/functions
    View Code

        使用echo命令输出一个命令,使用egrep取出路径的基名(基名:整个路径的最后一个文件或者目录)

    [root@oldboy ~]# echo "/etc/fstab" |grep -E -o "[^/]+/?>$"
    
    fstab
    View Code

        找出ifconfig命令结果中的IP地址

    [root@oldboy ~]# ifconfig|grep -E -o "(<[[:digit:]]+>.?){3}.?[[:digit:]]+"
    
    192.168.173.140
    
    192.168.173.255
    
    255.255.255.0
    
    127.0.0.1
    
    255.0.0.
    View Code

    找出ifconfig命令结果中的1-255的数值

    [root@oldboy ~]# ifconfig | grep -E -o "<[0-5]+>"|sort -u -n
    
    00
    
    1
    
    2
    
    3
    
    50
    
    140
    
    255
    
    1000
    
    1500
    View Code

       使用注意

         如果是扩展正则表达式,那么它的匹配模式的扩展正则元字符有一些不用转义,比如:小括号,大括号,加号等,但是锚定词首和词尾都需要加转义字符

    3、fgrep命令

    基本介绍

      fgrep命令不支持正则表达式搜索,你搜索字符是什么,就按照你搜索的去匹配

    基本语法

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

    基本使用

    [root@oldboy ~]# grep -F "a..t" fgrep.txt
    
    a..t
    
    [root@oldboy ~]# grep -F "^h" fgrep.txt
    
    ^h
    View Code
  • 相关阅读:
    maven 查看依赖jar包,或获取版版本号 、license
    windows 强制关掉端口
    项目经理是如何选择的?
    windows 10 多系统引导下安装debian linux 系统 引导文件
    在 Mac 环境下 emulator 模拟器不能上网 Android Studio AVD
    WordPress
    使用blob对H5视频播放进行加密
    算法——动态规划
    算法——贪婪算法
    算法——权重最短路径算法
  • 原文地址:https://www.cnblogs.com/lanxiansen/p/10484947.html
Copyright © 2020-2023  润新知