zoukankan      html  css  js  c++  java
  • grep与egrep的使用

    1. grep简介

      grep (global search regular expression_r(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。Unix的grep家族包括grep、egrep和fgrep。egrep和fgrep的命令只跟grep有很小不同。egrep是grep的扩展,支持更多的re元字符, fgrep就是fixed grep或fast grep,它们把所有的字母都看作单词,也就是说,正则表达式中的元字符表示回其自身的字面意义,不再特殊。linux使用GNU版本的grep。它功能更强,可以通过-G、-E、-F命令行选项来使用egrep和fgrep的功能。

      grep的工作方式是这样的,它在一个或多个文件中搜索字符串模板。如果模板包括空格,则必须被引用,模板后的所有字符串被看作文件名。搜索的结果被送到屏幕,不影响原文件内容。

      grep可用于shell脚本,因为grep通过返回一个状态值来说明搜索的状态,如果模板搜索成功,则返回0,如果搜索不成功,则返回1,如果搜索的文件不存在,则返回2。我们利用这些返回值就可进行一些自动化的文本处理工作。

    2. grep的用法及常用选项  

      格式:

      grep [options] 'PATTERN' file,...

      eg:找出/etc/passwd下关于root的的行  

    1 [root@localhost ~]# grep 'root' /etc/passwd
    2 root:x:0:0:root:/root:/bin/bash
    3 operator:x:11:0:operator:/root:/sbin/nologin

      常用选项:

          -v 反向,显示不能被模式所匹配到的行

      -o 仅显示被模式匹配到的字串,而不是整行

      -i 不区分字符大小写(ignore-case)

      -E 支持扩展的正则表达式与egrep具有相同意义

      -A# 显示被模式匹配到的行及下方的#行(after)

      -B# 显示被模式匹配到的行及上方的#行(before)

      -C# 显示被模式匹配到的行及上下#行

      --colour=auto 匹配到字串标红

    3. 基本正则表达式的元字符

      正则表达式:一类字符所书写出的模式(pattern),来处理字符串的方法,它是以行为单位来进行字符串的处理行为,正则表达式通过一些特殊称号的辅助,可以让用户轻易达到查找、删除、替换某特定字符串的处理程序。

      元字符:不表示字符本身的意义,用于额外功能性的描述。

      (1)字符匹配

        . 任意单个字符

        [] 指定范围内的单个字符

        [0-9]或[[:digit:]] 匹配数字0-9范围内的任意单个数字

        [a-z]或[[:lower:]] 匹配小写字母a-z范围内的任意单个字母 

        [[:alpha:]] 匹配大小字母a-z和A-Z范围内的任意单个字母

        [[:alnum:]] 匹配大小写字母a-z、A-Z、数字0-9范围内任意单个字符

        [[:space:]] 匹配空格

        [[:punct:]] 匹配标点符号

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

      (2)次数匹配 用来指定匹配其前面的字符的次数

        * 任意次数

        eg:x*y ------  xxy,xy,y均被匹配

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

        \? 0次或1次

        eg:x\?y------ xy,y,xxy 

    1 [root@localhost ~]# grep --colour=auto "x\?y" xy
    2 xxy
    3 xy
    4 y

           以上代码之所以能匹配到xxy是因为匹配原则中的贪婪模式:即尽可能的长的去匹配字符

         \{m\} 匹配m次

         \{m,n\} 匹配m到n次

           \{m,\} 匹配至少m次

         \{0,n\} 匹配至多n次

      (3)位置锚定

        ^ 锚定行首 ^char

        $ 锚定行尾 char$

        ^$ 空白行

        \<char 锚定词首 或者使用\bchar

        char\> 锚定词尾 或者使用char\b

        eg:在/etc/passwd中锚定以r开头的单词  

    1 [root@localhost ~]# grep '\<[rR]' /etc/passwd
    2 root:x:0:0:root:/root:/bin/bash
    3 operator:x:11:0:operator:/root:/sbin/nologin
    4 rpc:x:32:32:Rpcbind Daemon:/var/cache/rpcbind:/sbin/nologin
    5 rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
    6 ricci:x:140:140:ricci daemon user:/var/lib/ricci:/sbin/nologin

      (4)分组

        \(\)

        eg: \(ab\)*xy 表示ab出现重复多次

      (5)引用

        \1 后向引用,引用前面第1个左括号以及与之对应的右括号中的模式匹配到的内容

        \2 后向引用,引用前面第2个左括号以及与之对应的右括号中的模式匹配到的内容

        ...

        eg:\(a.b\)xy\1 

              文件内容:abxy,abbxy,a6bxya6b

            表示:可以匹配到a6bxya6b
     

    4. egrep的用法及扩展正则表达式的元字符

      egrep是grep的扩展,与grep的不同在于它支持更多的扩展元字符。

     (1)字符匹配

        . 任意单个字符

        [] 指定范围内的单个字符

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

     (2)次数匹配 用来指定匹配其前面的字符的次数

        * 任意次数

          ? 0次或1次

        + 匹配到至少1次

         {m} 匹配m次

         {m,n} 匹配m到n次

           {m,} 匹配至少m次

         {0,n} 匹配至多n次

     (3)位置锚定

        ^ 锚定行首 ^char

        $ 锚定行尾 char$

        ^$ 空白行

        \<char 锚定词首 或者使用\bchar

        char\> 锚定词尾 或者使用char\b

     (4)分组

        ()

              | 或者  eg:a|b 表示a或者b

    5.实例

        1、显示/proc/meminfo文件中以大小写s开头的行;  

    # grep ^[sS] /proc/meminfo

            2、取出默认shell为非bash的用户;

    # grep -v 'bash$' /etc/passwd |cut -d: -f1

        3、取出默认shell为bash的且其ID号最大的用户;

    # grep 'bash$' /etc/passwd|sort -t: -k3|tail -1|cut -d: -f1

         4、显示/etc/rc.d/rc.sysinit文件中,以#开头,后面跟至少一个空白字符,而后又有至少一个非空白字符的行;

    # grep '^#[[:space:]]\{1,\}[^[:space:]]\{1,\}' /etc/rc.d/rc.sysinit

        5、显示/boot/grub/grub.conf中以至少一个空白字符开头的行;

    # grep "^[[:space:]]\{1,\}" /boot/grub/grub.conf

         6、找出/etc/passwd文件中一位数或两位数;

    # grep "\<[0-9]\{1,2\}\>" /etc/passwd

        7、找出ifconfig命令结果中的1到255之间的整数;

    # ifconfig | egrep "\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>"

         8、查看当前系统上root用户的所有信息;

    # grep "^root\>" /etc/passwd

           9、添加用户bash和testbash、basher,而后找出当前系统上其用户名和默认shell相同的用户;

    # grep "^\<\([[:alnum:]]\{1,\}\)\>.*\1$" /etc/passwd

           10、找出netstat -tan命令执行的结果中以“LISTEN”或“ESTABLISHED”结尾的行;

    # netstat -tan |egrep "\<LISTEN\>[[:space:]]*$|\<ESTABLISHED\>[[:space:]]*$"

         11、取出当前系统上所有用户的shell,要求:每种shell只显示一次,且按升序显示;

    # cut -d: -f7 /etc/passwd| sort -u

          12、写一个模式,能匹配IP地址

    grep -E "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" file 

        

  • 相关阅读:
    vuejs cli3 env配置文件实践指南
    Nginx的rewrite(地址重定向)剖析
    什么是TCP粘包?怎么解决这个问题
    windows bat批处理语法简析
    BAT文件语法和技巧(bat文件的编写及使用)
    Asyncio之EventLoop笔记
    python struct的使用例子
    redis慢查询笔记
    redis基础操作概念等笔记
    Python实现Dijkstra算法
  • 原文地址:https://www.cnblogs.com/musenl/p/4016508.html
Copyright © 2011-2022 走看看