LINUX正则表达式

  正则表达式(Regular Expression)是一种字符串处理的标准,对于系统管理员来说,正则是一门必修技。例如:系统产生数据量太大,身为系统管理员每天去看这么多的信息数据, 从千百行的数据里面找出一行有问题的信息,怎么办? 这个时候,我们就可以透过正则表达式的功能,将这些登录的资讯进行处理, 仅取出有问题的资讯来进行分析,如此一来,你的系统管理工作将会更加直观,简便!    

  正则表达式中我们常使用的命令,三剑客:grep、sed、awk。通常使用三剑客结合正则的特殊字符,来完成我们需要的操作。


选项与参数:
-A :后面可加数字,为 after 的意思,除了列出该行外,后续的 n 行也列出来;
-B :后面可加数字,为 befer 的意思,除了列出该行外,前面的 n 行也列出来;
-C  :类似-A -B ,接数字,前后的n行打印;
--color=auto 可将正确的那个撷取数据列出颜色;(使用alias grep=‘grep --color=auto‘ ,添加到~/.bashrc永久生效)
-i  :忽略匹配字符的大小写;
-v  :将未被匹配的行打印;
-n  :输出行号;
-o  :仅打印匹配的字段而不是行,用来统计匹配到多少次
-E  :此时相当于egrep,使用扩展的正则表达式

介绍玩grep常用选项后,结合grep来看看基础正则常用的特殊字符。


正则表达式特殊字符归纳

  • ^word 意义:待搜寻的字串(word)在行首!

 范例:搜寻行首为 # 开始的那一行,并列出行号 

grep -n ‘^#‘ filename 


  • word$ 意义:待搜寻的字串(word)在行尾!

 范例:将行尾为 ! 的那一行列印出来,并列出行号 

grep -n ‘!$‘ filename 

  • ^$ 意义:空白行,开头之后就是结尾当然是空行了!


  • . 意义:代表『一定有一个任意字节』的字符!

 范例:搜寻的字串可以是 (eve) (eae) (eee) (e e), 但不能仅有 (ee) !亦即 e 与 e 中间『一定』仅有一个字节,而空白字节也是字节! 

grep -n ‘e.e‘ filename 


  • \ 意义:跳脱字符,将特殊符号的特殊意义去除!

 范例:搜寻含有单引号 ‘ 的那一行! 

grep -n \‘ filename 


  • * 意义:重复零个到无穷多个的前一个 RE 字符

 范例:找出含有 (es) (ess) (esss) 等等的字串,注意,因为 * 可以是 0 个,所以 es 也是符合带搜寻字串。另外,因为 * 为重复『前一个 RE 字符』的符号, 因此,在 * 之前必须要紧接著一个 RE 字符喔!例如任意字节则为 『.*』 ! 

grep -n ‘ess*‘ filename


  • [list] 意义:字节集合的 RE 字符,里面列出想要撷取的字节!

 范例:搜寻含有 (gl) 或 (gd) 的那一行,需要特别留意的是,在 [] 当中『谨代表一个待搜寻的字节』, 例如『 a[afl]y 』代表搜寻的字串可以是 aay, afy, aly 即 [afl] 代表 a 或 f 或 l 的意思! 

grep -n ‘g[ld]‘ filename 


  • [n1-n2] 意义:字节集合的 RE 字符,里面列出想要撷取的字节范围!

 范例:搜寻含有任意数字的那一行!需特别留意,在字节集合 [] 中的减号 - 是有特殊意义的,他代表两个字节之间的所有连续字节!但这个连续与否与 ASCII 编码有关,因此,你的编码需要配置正确(在 bash 当中,需要确定 LANG 与 LANGUAGE 的变量是否正确!) 例如所有大写字节则为 [A-Z] 

grep -n ‘[A-Z]‘ filename 


  • [^list] 意义:字节集合的 RE 字符,里面列出不要的字串或范围!

 范例:搜寻的字串可以是 (oog) (ood) 但不能是 (oot) ,那个 ^ 在 [] 内时,代表的意义是『反向选择』的意思。 例如,我不要大写字节,则为 [^A-Z]。但是,需要特别注意的是,如果以 grep -n [^A-Z] regular_express.txt 来搜寻,却发现该文件内的所有行都被列出,为什么?因为这个 [^A-Z] 是『非大写字节』的意思, 因为每一行均有非大写字节,例如第一行的 "Open Source" 就有 p,e,n,o.... 等等的小写字 

grep -n ‘oo[^t]‘ filename 


  • \{n,m\} 意义:连续 n 到 m 个的『前一个 RE 字符』

 意义:若为 \{n\} 则是连续 n 个的前一个 RE 字符,

 意义:若是 \{n,\} 则是连续 n 个以上的前一个 RE 字符! 范例:在 g 与 g 之间有 2 个到 3 个的 o 存在的字串,亦即 (goog)(gooog) 

grep -n ‘go\{2,3\}g‘ filename 


  • \<和\> 意义:

    \<后面接的字符必须是一个单词最前部分;

    \>前面接的字符必须是一个单词的最后部分;

    注意:一个单词定义的是:字母、数字、下划线的组合

    所以\<word\>必须是单独的word单词才会匹配,其他符号如: ()/等都会视为单词分割号

  • 分组\( \) 意义:

    小括号的内容作为整体,如\(ab\)* 匹配0个到无穷个ab

    范例:test文件内容如下:

    love:lover

    love:liker

    like:lover

    like:liker

    如何取出1和4行?

    在使用分组功能时,我们可以通过\1 \2 \3 ...来引用,所以:

    grep ‘\(.*\):\1r‘ test


本文出自 “SweetSmile” 博客,请务必保留此出处http://daizhancheng.blog.51cto.com/9708457/1632044

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。