文本处理三剑客之GREP

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了文本处理三剑客之GREP相关的知识,希望对你有一定的参考价值。

文本处理三剑客(grep)

  • grep:文本过滤(模式:pattern)工具
    grep, egrep, fgrep(不支持正则表达式搜索)
    作用:文本搜索工具,根据用户指定的“模式”对目标文本逐行进行匹配检查;打印匹配到的行
    模式:由正则表达式字符及文本字符所编写的过滤条件

    grep命令选项

    -color=auto: 对匹配到的文本着色显示
    -m # 匹配#次后停止
    -v 显示不被pattern匹配到的行
    -I 忽略字符大小写
    -n 显示匹配的行号
    -c 统计匹配的行数
    -o 仅显示匹配到的字符串
    -q 静默模式,不输出任何信息
    -A # after, 后#行
    -B # before, 前#行
    -C # context, 前后各#行
    -e 实现多个选项间的逻辑or关系
    grep –e ‘cat ’ -e ‘dog’ file
    -w 匹配整个单词
    -E 使用ERE
    -F 相当于fgrep,不支持正则表达式
    -f file 根据模式文件处理

    正则表达式

    REGEXP: Regular Expressions,由一类特殊字符及文本字符所编写的模式其中有些字符(元字符)不表示字符字面意义,而表示控制或通配的功能
    程序支持:grep,sed,awk,vim, less,nginx,varnish等

    分两类:

    基本正则表达式:BRE
    扩展正则表达式:ERE
    grep -E, egrep

    正则表达式引擎:

    采用不同算法,检查处理正则表达式的软件模块
    PCRE(Perl Compatible Regular Expressions)

    元字符分类

    字符匹配、匹配次数、位置锚定、分组
    man 7 regex

    基本正则表达式元字符

    字符匹配

    . 匹配任意单个字符
    [] 匹配指定范围内的任意单个字符,示例:[wang] [0-9] [a-z] [a-zA-Z]
    [^] 匹配指定范围外的任意单个字符
    [:alnum:] 字母和数字
    [:alpha:] 代表任何英文大小写字符,亦即 A-Z, a-z
    [:lower:] 小写字母
    [:upper:] 大写字母
    [:blank:] 空白字符(空格和制表符)
    [:space:] 水平和垂直的空白字符(比[:blank:]包含的范围广)
    [:cntrl:] 不可打印的控制字符(退格、删除、警铃...)
    [:digit:] 十进制数字 [:xdigit:]十六进制数字
    [:graph:] 可打印的非空白字符
    [:print:] 可打印字符
    [:punct:] 标点符号正则表达式

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

    • 匹配前面的字符任意次,包括0次
      贪婪模式:尽可能长的匹配
      .* 任意长度的任意字符
      ? 匹配其前面的字符0或1次
      + 匹配其前面的字符至少1次
      {n} 匹配前面的字符n次
      {m,n} 匹配前面的字符至少m次,至多n次
      {,n} 匹配前面的字符至多n次
      {n,} 匹配前面的字符至少n次正则表达式

      位置锚定:定位出现的位置

      ^ 行首锚定,用于模式的最左侧
      $ 行尾锚定,用于模式的最右侧
      ^PATTERN$ 用于模式匹配整行
      ^$ 空行
      ^[[:space:]]*$ 空白行
      < 或  词首锚定,用于单词模式的左侧
      > 或  词尾锚定,用于单词模式的右侧
      <PATTERN> 匹配整个单词正则表达式
      分组

  • () 将一个或多个字符捆绑在一起,当作一个整体处理,如:(root)+
    分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量的命名方式为: 1, 2, 3, ...
    1 表示从左侧起第一个左括号以及与之匹配右括号之间的模式所匹配到的字符

示例: (string1+(string2))
1 :string1+(string2)

2 :string2

  • 后向引用:引用前面的分组括号中的模式所匹配字符,而非模式本身或者:|

    示例:a|b: a或b C|cat: C或cat (C|c)at:Cat或ca

egrep及扩展的正则表达式

egrep = grep -E  
egrep [OPTIONS] PATTERN [FILE...]  

扩展正则表达式的元字符

字符匹配

. 任意单个字符  
[] 指定范围的字符  
[^] 不在指定范围的字符扩展正则表达式  

次数匹配

* 匹配前面字符任意次  
? 0或1次  
+ 1次或多次  
{m} 匹配m次  
{m,n} 至少m,至多n次扩展正则表达式  

位置锚定

^ 行首  
$ 行尾  
<,  语首   
>,  语尾  

分组

()  
后向引用:1, 2, ...  

或者

a|b a或b  
C|cat C或cat  
(C|c)at Cat或cat  

正则表达式

元字符 定义
^ 行首
$ 行尾
. 任意单一字符
[] []内任意单一字符
[^] 除[]内任意单一字符
* *前面字符重复不确定次数
+ +前面字符重复一次以上不确定次数
? ?前面字符重复0或1次
转义符
.* 任意长度字符
{n} 前面字符重复n次
{n,} 前面字符重复n次以上
{m,n} 前面字符重复m次和n次之间
[:alnum:] 字母和数字
[:alpha:] 代表任何英文大小写字符,亦即 A-Z, a-z
[:lower:] 小写字母
[:upper:] 大写字母
[:blank:] 水平空白字符(空格和制表符)
[:space:] 所有水平和垂直的空白字符(比[:blank:]包含的范围广)
[:cntrl:] 不可打印的控制字符(退格、删除、警铃...)
[:digit:] 十进制数字
[:graph:] 可打印的非空白字符
[:print:] 可打印字符
[:punct:] 标点符号
[:xdigit:] 十六进制数字

以上是关于文本处理三剑客之GREP的主要内容,如果未能解决你的问题,请参考以下文章

Linux文本处理工具三剑客之grep

Linux文本处理三剑客之grep

文本处理三剑客之---grep系

文本处理三剑客之GREP

文本处理三剑客之grep

文本处理三剑客之-grep