grep、正则表达式

grep、正则表达式

  • grep:文本过滤(模式:pattern)工具
    作用:文本搜索工具,根据用户指定的“模式”对目标文本逐行进行匹配检查;打印匹配到的行。
    模式:由正则表达式字符及文本字符所编写的过滤条件。
  • 正则表达式:由一类特殊字符及文本所编写的模式,其中有些字符不表示字符字面意义,而表示控制或通配的功能。
    正则表达式分为两类:基本正则表达式、扩展正则表达式
  • grep工具支持基本正则表达式,egrep支持扩展正则表达式,fgrep快速搜索,不支持正则。

grep

  • grep [OPTIONS] PATTERN [FILE…]
    grep [OPTIONS] [-e PATTERN | -f FILE] [FILE…]
    –color==auto 高亮显示匹配到的字符串
    -o 仅显示匹配到的字符串
    -v 取反、显示不能被pattern匹配到的行
    -i 忽略字符的大小写
    -n 显示行号
    -c 显示统计到的行数,等同于wc -l
    -q 静默输出 只关心命令的执行结果 不关心输出结果
    -e 指定多个条件,条件是或的关系
    -w 匹配整个单词
    -A 后几行
    -B 前几行
    -C 前后几行 查看日志 搜索关键字排查错误的时候
    -E === egrep 支持扩展的正则表达式
    -F === fgrep 不支持正则表达式

基本正则表达式

  • 字符匹配
    . :匹配任意单个字符
    [] :匹配指定范围内的任意单个字符
    [^] :匹配指定范围外的任意单个字符
    以上[]中的范围有以下几种表示方法:

    • [:alnum:] 所有的数字和字符
      [:alpha:] 所有的字母(不区分大小写)
      [:lower:] 小写字母
      [:upper:] 大写字母
      [:space:] 专门匹配空格
      [:cntrl:] 不可打印的控制字符(退格、删除、警铃…)
      [:digit:] 十进制数字 ;[:xdigit:]十六进制数字
      [:graph:] 可打印的非空白字符
      [:print:] 可打印字符
      [:punct:] 标点符号
  • 次数匹配
    用于在要指定次数的字符后面,用于前面的字符要出现的次数:

    *:匹配前面的字符任意次,0 到无穷次
    注:默认情况下,正则表达式是工作在贪婪模式下,能匹配多少就匹配多少
    .* 任意字符出现任意次 
    a* a字符出现任意次 
    \? 匹配前面的字符出现0次或者1次 
    \+ 匹配前面的字符至少1次 
    \{n\} 前面的字符出现n次 
    \{m,n\}匹配前面的字符出现m到n次,m,n是一个范围 
    \{,n\}匹配前面的字符最多出现n 
    \{m,\}匹配前的字符至少出现m次
    \ 转义符

  • 位置锚定 
    ^ 锚定行首,用于模式的最左侧
    $ 锚定行尾,用于模式的最右侧

    ^$ 匹配空行的
    ^[[:space:]] 行首是空白的字符
    ^[[:space:]]*$ 也是 空行
    ^a 以a开头的行
    b$ 以b结束的行
    ^a.*b$ 以a开头 中间任意字符 以b结尾的行
    ^a.*[[:space:]]\{3\}.*b$ a开头跟任意字符,中间出现三次空格再跟任意字符 以b结尾的行
    ^# 以#开头的行

    \b \b 匹配词首和词尾 ;\bPATTERN\b
    \< > 匹配词首和词尾 ;\<PATTERN\>

  • 分组 \(\)
    将一个或多个字符捆绑在一起,当做一个整体进行处理,符号:()
    (xy)*ab 表示xy这个整体可以出现任意次`
    注:1、分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量的命名方式:\1,\2,\3, …
    2、后向引用:引用前面的分组括号中的模式所匹配的字符,而非模式本身

  • 或者 \|
    a \| b
    C \| cat

扩展正则表达式

  • grep -E ‘PATTERN’ FILE…
    egrep ‘PATTERN’ FILE…

  • 字符匹配
    . :匹配任意单个字符
    [] :匹配指定范围内的任意单个字符
    [^] :匹配指定范围外的任意单个字符
    以上[]中的范围有以下几种表示方法:

    • [:alnum:] 所有的数字和字符
      [:alpha:] 所有的字母(不区分大小写)
      [:lower:] 小写字母
      [:upper:] 大写字母
      [:space:] 专门匹配空格
      [:cntrl:] 不可打印的控制字符(退格、删除、警铃…)
      [:digit:] 十进制数字 ;[:xdigit:]十六进制数字
      [:graph:] 可打印的非空白字符
      [:print:] 可打印字符
      [:punct:] 标点符号
  • 次数匹配
    用于在要指定次数的字符后面,用于前面的字符要出现的次数:

    *:匹配前面的字符任意次,0 到无穷次
    注:默认情况下,正则表达式是工作在贪婪模式下,能匹配多少就匹配多少
    .* 任意字符出现任意次 
    ? 匹配前面的字符出现0次或者1次 
    + 匹配前面的字符至少1次 
    {n} 前面的字符出现n次 
    {m,n}匹配前面的字符出现m到n次,m,n是一个范围 
    {,n}匹配前面的字符最多出现n 
    {m,}匹配前的字符至少出现m次

  • 位置锚定 
    ^ 锚定行首,用于模式的最左侧
    $ 锚定行尾,用于模式的最右侧

    ^$ 匹配空行的
    ^[[:space:]] 行首是空白的字符
    ^[[:space:]]*$ 也是 空行
    ^a 以a开头的行
    b$ 以b结束的行
    ^a.*b$ 以a开头 中间任意字符 以b结尾的行
    ^a.*[[:space:]]\{3\}.*b$ a开头跟任意字符,中间出现三次空格再跟任意字符 以b结尾的行
    ^# 以#开头的行

    \b \b 匹配词首和词尾 ;\bPATTERN\b
    \< > 匹配词首和词尾 ;\<PATTERN\>

  • 分组 ()
    将一个或多个字符捆绑在一起,当做一个整体进行处理,符号:()
    (xy)*ab 表示xy这个整体可以出现任意次

  • 或者 |
    a | b
    C | cat

原创文章,作者:s,如若转载,请注明出处:http://www.178linux.com/72661

(0)
ss
上一篇 2017-04-06 19:20
下一篇 2017-04-06 20:12

相关推荐

  • 初识shell脚本编程

    shell脚本基础 shell脚本是包含一些命令或声明,并符合一定格式的文本文件 一般格式要求: 1.首行shebang机制 #!/bin/bash #!/bin/python #!/usr/bin/perl 2.注释信息 以#开头,可写明脚本用途,作者,版本,时间等 3.脚本正文内容, 创建shell脚本 以bash为例 第一行定格#!/bin/bash …

    Linux干货 2016-08-15
  • 迁移用户数据到独立分区

    Linux操作系统中,/home目录下为各个普通用户的家目录,主要用于存放用户的配置信息及相关文件。若安装操作系统时,采用了home目录与根目录处在同一分区的分区策略,那么随着用户数据较多,很有可能将分区空间耗尽,导致系统崩溃。所以最好是将用户数据所在目录放在一个独立的分区上,但由于/home目录下已有一些用户数据,要想将home目录建立在一个独立的分区上,…

    Linux干货 2017-08-13
  • 第三周作业

      1、列出当前系统上所有已经登录的用户的用户名,注意:同一个用户登录多次,则只显示一次即可。 who | cut -d" " -f1 | sort -u who | cut -d" " -f1 | uniq 2、取出最后登录到当前系统的用户的相关信息。    who | tail -1 …

    Linux干货 2016-11-19
  • 路漫漫其修远兮第十周

    1、请详细描述CentOS系统的启动流程(详细到每个过程系统做了哪些事情) 从dawning大湿兄那里借来的图,如下: 启动过程 (PC架构) POST –> Boot Sequence(BIOS) –> Boot Loader (MBR)–>GRUB—> Kernel(ramdisk) &#821…

    Linux干货 2017-02-24
  • 自制Linux系统

    自制Linux系统 1.首选准备一台Linux虚拟机并添加一块新硬盘 2.分区并创建文件系统,创建两个必要的分区根分区和boot分区 fdisk /dev/sdb  分区 mke2fs -t ext4 /dev/sdb1    创建boot文件系统 mke2f…

    Linux干货 2016-09-16
  • 软链接,硬链接区别

    软硬链接涉及文件系统inode, 区分于inode号,硬链接inode号与链接文件相同,且创建链接不占空间.而软链接占名称字节个空间,且inode号与链接文件不同; 两者查找inode号命令都可查找inode号,命令为ls -i,如需查找本目录要加d; 在创建链接环境上,硬链接只能在同分区创建一个,不能跨分区创建;而软链接可以跨分区创建多个链接文件且可以多个…

    Linux干货 2016-10-20