欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

文本处理三剑客之 grep/egrep

程序员文章站 2023-02-26 13:09:59
grep:文本过滤工具 支持BRE egrep: 支持ERE fgrep: 不支持正则 作用:根据用户指定的“模式”,对目标文本逐行进行匹配检查,打印匹配到的行 模式:由正则表达式字符及文本字符所编写的过滤条件 [OPTIONS] PATTERN [FILE...] options: -v:显示不被 ......

  grep:文本过滤工具 支持bre
  egrep: 支持ere
  fgrep: 不支持正则

    作用:根据用户指定的“模式”,对目标文本逐行进行匹配检查,打印匹配到的行
    模式:由正则表达式字符及文本字符所编写的过滤条件
        [options] pattern [file...]
    options:

      -v:显示不被pattern匹配的行 排除

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

grep  -v '/bin/bash$' /etc/passwd

 


      -i:忽略字符大小写
      -n:显示匹配的行号
      -c:显示匹配的行数
      -o:仅显示被匹配的字符串
      -q:静默模式,不输出任何信息
      -a #:after,后#行
      -b #:before,前#行
      -c #:context,前后各#行
      -e:实现多个选择间的逻辑or关系
      -w:整行匹配整个单词
      -e:使用扩展的正则表达式 相当于egrep  
      -f:使用fgrep,不支持正则表达式 相当于fgrep
      --color:将过滤出内容加上颜色显示

alias grep='grep --color=auto'
 
[root@centos6 ~ 01:43:05]#grep -i "^s" /proc/meminfo 
swapcached: 0 kb
swaptotal: 1535996 kb
swapfree: 1535996 kb
shmem: 228 kb
slab: 88064 kb
sreclaimable: 61960 kb
sunreclaim: 26104 kb
[root@centos6 ~ 01:43:24]#grep "^[ss]" /proc/meminfo

 

  基本正字表达式bre:

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

    以下是元字符:
      [:digit:]:数字
      [:lower:]:小写字母
      [:upper:]:大写字母
      [:alpha:]:所有字母
      [:space:]:空白字符
      [:alnum:]:所有字母及数字
      [:punct:]:所有标点符号
      [:graph:]:可打印的非空白字符;
      [:blank:]:水平空白字符(空格和制表符)
      [:cntrl:]:不可打印的控制字符(退格、删除、警铃)
      [:pirnt:]:打印字符
      [:xdigit:]:十六进制数字

# 显示/etc/grub2.cfg文件中,至少一个空白字符开头的且后面存非空白字符的行
 grep "^[[:space:]]\+[^[:space:]]" /etc/grub2.cfg

# 找出“netstat -ant” 命令的结果中以“listen”后跟0,1或多个空白字符结尾的行

netstat -ant |grep "listen[[:space:]]*$"    # 注意,使用元字符时,字符本身的中括号外,还需要加一层中括号

# 添加用户bash,testbash,basher以及nologin,而且找出/etc/passwd 文件中用户名同shell名的行
useradd bash
useradd testbash
useradd basher 
useradd -s /sbin/nologin login
grep "^\([[:alnum:]]\+\>\).*\1$" /etc/passwd

# 显示/var目录下所有以l开头,以一个小写字母结尾,且中间出现至少以为数字的文件或目录

ls -d /var/l*[0-9]*[[:lower:]]

# 显示/etc目录下,以任意一位数字开头,且以非数字结尾的文件或目录
ls -d /etc/[0-9]*[^0-9]
ls -d /etc/[[:digit:]]*[^[:digit:]]

# 显示/etc目录下,以非字母开头,后面跟了一个字母及其其他任意长度任意字符的文件或目录
ls -d /etc/[^[:alpha:]][[:alpha:]]*
 

    次数匹配:

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

      *:匹配前面的字符任意次
      .*:匹配任意长度的任意字符
      \?:匹配前面的字符0次或1次
      \+:匹配前面的字符至少1次,至多不限
      \{m\}:匹配前面的字符m次
      \{m,\}:匹配前面的字符至少m次,至多不限
      \{m,n\}:匹配前面的字符至少m次,至多n次
    

    位置锚定:
      ^:行首锚定,用于模式的最左侧
      $:行尾锚定,用于模式的最右侧
      ^$:空白行,连space也不允许出现
      ^[[:space:]]*$:空白行或包含空白字符的行
      \<或\b:词首锚定,出现在单词的左侧
      \>或\b:词尾锚定,出现在单词的右侧
      \<pattern\>:完整匹配单词

# 去除nginx.conf里面的的空行和注释行

   grep -ev "^$|#" nginx.conf
  ^$  空行
  |  或者
  #  注释行开头字符

 

 

    分组及引用:

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

    后向引用:

      引用前面的分组括号中的模式所匹配的字符

分组括号中的模式匹配到的内容会被正则表达式引擎记录与内部的变量中,这些变量的命名
    方式为\1,\2,\3
      \1: 从左侧起,第一个左括号以及与之匹配右括号之间的模式所匹配的字符
      \(ab\+\(xy\)*\)
      \1: ab\+\(xy\)*\
      \2: xy

  egrep及扩展正则表达式(extandard regexp):

    字符匹配:

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

    次数匹配:

      *:任意次
      ?:0次或1次
      +:其前一次最少一次或多次
      {m}:匹配其前字符m次
      {m,n}:匹配其前字符最少m次,最多n次

    位置锚定:
      ^:行首锚定,用于模式的最左侧
      $:行尾锚定,用于模式的最右侧
      ^$:空白行,连space也不允许出现
      \<或\b:词首锚定,出现在单词的左侧
      \>或\b:词尾锚定,出现在单词的右侧
   

    分组及引用:

    ():分组;括号内的模式匹配到的字符会被记录到正则表达式引擎的内部变量中
    后向引用:\1,\2,\3....
    或:
    | a|b a或者b