Linux grep正则表达式

时间:2020-12-16 00:49:27

简介

grep是Linux下的行过滤命令,它是一种部分匹配,即行内包含我们指定的字符串即可,不需要全部匹配。如果想要完全匹配,需要加^和$.

常用选项

  • -i 忽略大小写
  • -n 标明多少行
  • -c 统计匹配的行数
  • -o 只输出行中匹配的部分
  • -v 不包含
  • -r 递归过滤(对目录下的所有子目录的文件进行过滤)
  • -C # 显示匹配到的行时,顺便显示前面和后面的#行
  • -A # 显示匹配到的行时,顺便显示后面的#行
  • -B # 显示匹配到的行时,顺便显示前面的#行
  • –color 高亮显示匹配字符串

  • 在1.txt中查找含有zn的行,不区分大小写
    cat 1.txt | grep -i 'zn'
  • 在1.txt中查找含有zn的行,并显示匹配行的行号
    cat 1.txt | grep -n 'zn'
  • 在1.txt中统计含有zn的行数
    cat 1.txt | grep -c 'zn'
  • 在1.txt中查找不包含zn的行
    cat 1.txt | grep -v 'zn'
  • 在zn目录下递归查找所有文件中包含zn的行
    grep -r 'zn' zn
  • 在1.txt中查找包含zn的行,并显示该行的上三行和下三行
    cat 1.txt | grep -C 3 'zn'
  • 在1.txt中查找包含zn的行,只输出匹配的部分
    cat 1.txt | grep -o 'zn'
  • 在1.txt中查找包含zn的行,并用颜色高亮显示匹配的部分
    cat 1.txt | grep --color 'zn'

常用正则匹配

单个字符

  • .代表单个任意字符
  • 范围内任意字符 [a-z]
  • 范围外任意字符 [^a-z]

重复紧跟其前的字符串

  • 0次或1次\?

    比如a\?代表没有a或者一个a, 查找1.txt文件中含有0个或1个a的行
    cat 1.txt | grep 'a\?'

  • 0,1或多次

    比如 a*代表没有a,1个a或多个a ,查找1.txt文件中含有任意个a的行
    cat 1.txt | grep 'a*'

  • 1次或多次 \{1,\}

    比如a\{1,\}代表至少一个a, 查找1.txt文件中至少含有一个a的行
    cat 1.txt | grep 'a\{1,\}'

  • n次 \{n\}

    比如 a\{2\}代表aa, 查找1.txt文件中含有aa的行
    cat 1.txt | grep 'a\{2\}'

开头结尾

  • ^ 以什么开头

    比如 ^a代表以a开头 ,查找1.txt文件中以a开头的行
    cat 1.txt | grep '^a'

  • $以什么结尾

    比如 a$代表以a结尾,查找1.txt文件中以a结尾的行
    cat 1.txt | grep 'a$'

  • 空行 ^$

    查找1.txt文件中的空行
    cat 1.txt | grep '^$'

单词(单词的前后需要有空格)

  • \< 以什么开头的单词

    比如 \<good代表以good开头的单词,good之前需要有空格
    查找1.txt文件中的含有以good开头的单词的行
    cat 1.txt | grep '\<good'

  • \> 以什么结尾的单词

    比如 good\>代表以good结尾的单词,good之后需要有空格
    查找1.txt文件中的含有以good结尾的单词的行
    cat 1.txt | grep 'good\>'

  • \<good\> 查找含有good单词的行

    cat 1.txt | grep '\<good\>'

分组(与前面相同)


  • \(..\) \1

比如 \(like\).* \1$ 代表的就是前面出现like,并以like结尾

  • 查找1.txt中,good后面还有good的行
    cat 1.txt | grep '\(good\).* \1'
  • 字符与字符集

    • [:digit:] 数字 [0-9]或者\d(linux下不一定支持)
    • [:alpha:] 字母 [a-zA-Z]
    • [:lower:] 小写字母
    • [:upper:] 大小字母
    • [:alnum:] 字母或数字
    • [:punct:] 标点符号
    • [:space:] 空白字符
    • \d 数字 (mac下可以使用,centos不行)
    • \w 数字,字母或下划线
    • \s 空白字符,包括空格,制表符,换行符等,等价于[\f\t\r\n]
    • 查找1.txt中含有数字的行(注意:两个空括号)
      cat 1.txt | grep '[[:digit:]]'
      cat 1.txt | grep '\d'
    • 查找1.txt中含有空白字符的行
      cat 1.txt | grep '[[:space:]]'
      cat 1.txt | grep '\s'

    常见应用

    (1)、显示/proc/meminfo文件中以不区分大小的s开头的行;
    grep "^[sS]" /proc/meminfo
    (2)、显示/etc/passwd中以nologin结尾的行;
    grep "nologin$" /etc/passwd
    (3)、显示/etc/inittab中的空行;
    grep "^$" /etc/inittab
    (4)、显示/etc/passwd中,以r开头的字符而后跟了任意单个字符的行;(–color 高亮显示匹配字符串)
    grep --color "^r." /etc/passwd
    (5)、显示/etc/passwd中,以r开头后跟了o,o出现任意次的行;
    grep --color "^ro*" /etc/passwd
    (6)、显示/etc/passwd文件中,r后跟了任意长度任意字符,接着跟了h的行;
    grep --color "r.*h" /etc/passwd
    (7)、显示/etc/passwd中,r后跟了o,o出现0次或者1次的行;
    grep --color "ro\?" /etc/passwd
    (8)、显示/etc/passwd中,r后跟了o,o出现至少1次至多2次的行;
    grep --color "ro\{1,2\}" /etc/passwd
    (9)、显示/etc/passwd中,r后跟了o,o只出现2次的行;
    grep --color "ro\{2\}" /etc/passwd
    (10)、显示/etc/passwd中,匹配root这个单词的行;
    grep --color "\<root\>" /etc/passwd