正则表达式和扩展正则表达式

 

 先了解下基础概念:字符是计算机软件处理文字时最基本的单位,可能是字母,数字,标点符号,空格,换行符,汉字等等。字符串0个或更多个字符的序列。文本也就是文字,字符串。说某个字符串匹配某个正则表达式,通常是指这个字符串里有一部分(或几部分分别)能满足表达式给出的条件。

 正则表达式:是指一个用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串。vimgrepawk sed 等工具都支持正则表达式,本文介绍如何使用grepegrep命令。而扩展正则表达式比基本正则表达式拥有更强大的功能。

 

  1.   简介

grep的主要功能用于检索文件内容,字符串等的工具。可以根据用户指定的模式(pattern对目标文本进行搜索过滤,显示出被模式pattern”匹配到的行。

其基本语法是:

 grep [OPTIONS]PATTERN [FILE...]

PATTERN:是文本字符和正则表达式的元字符组合而成的匹配条件,可用单引号‘ ’pattern括起来以避免shell通配的影响,强引用不替换而显示字符本身。" " 双引号,字符串中的` ` ,$, \ 等特殊字符会被shell解释替换后,再传递给grep。对普通的字符串(没有特殊字符和空格的字符串)也可以不加引号,直接搜索。

     OPTIONS:(这里给出常用的选项)

 -i 忽略大小写

 -c 显示被匹配到的行数

-n 输出行号

-v 反向选择,即找没有搜索字符串的行

-o 仅显示匹配到的内容

-w 匹配单词

-A #  连同匹配行的下#行一并显示,#代表任意数字

 -B #  连同匹配行的上#行一并显示,#代表任意数字

-C #  连同匹配行的上下#行一并显示,#代表任意数字

-R-r 递归搜索目录或子目录下匹配的字所在文件(可配合find命令

-E  相当于egrep 支持扩展的正则表达式

-F  相当于fgrep 不支持正则表达式

--color对匹配的内容以颜色显示

-V  显示grep版本

grep中不太常用的选项:

-P, --perl-regexp         PATTERN 是一个 Perl 正则表达式

-q 取消显示,只返回退出状态。0则表示找到了匹配的行;找不到返回1,搜索的文件不存在返回2

-h --no-filename  #在显示符合样式的那一列之前,不标示该列所属的文件名称。

-H  --with-filename  #在显示符合样式的那一列之前,表示该列所属的文件名称。(默认方式)

 -L 输出时只显示不包含匹配项的文件名,通常与-r选项连用来查找带指定内容的文件。

-l 输出时只显示包含匹配项的文件名。


正则表达式:            默认匹配次数:贪婪模式,尽可能多的去匹配

    . 匹配任意单个字符

    \.表示.本身   \逃逸符

     * 匹配其前面的字符任意次可为0

    .* 任意长度的任意字符

    \? 匹配其前面字符1次或0

x\{m\}:匹配其前面的字符“x”m(精确匹配)

x\{m,\}:匹配其前面的字符“x”至少m

x\{m,n\}:匹配其前面的字符“x”至少m次,至多n

 \{1,\} 1次至无上限 \{0,3\}至少3

    ^ 锚定行首,此字符后面的任意内容必须出现在行首 

    $ 锚定行尾,次字符前面的任意内容必须出现在行尾 

    ^$表示空行

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

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

    \< 其后面的任意字符必须作为单词的首部出现  \b

    \> 其前面的任意字符必须作为单词的尾部出现  \b

    \<\> 锚定单词例如 \<root\>

 纯数字 [[:digit:]][0-9]

    小写字母 [[:lower:]][a-z]

    大写字母 [[:upper:]][A-Z]

    大小写字母 [[:alpha:]][a-zA-Z]

    数字加字母 [[:alnum:]][0-9a-zA-Z]

    空白字符 [[:space:]]  非空白字符[^[:space:]]

    标点符号 [[:punct:]][^a-zA-Z0-9]

    \d  匹配任何十进制数,相当于[0-9]     -P选项加上

 \D 匹配任何非数字字符,相当于[^0-9]    -P选项加上

 \s  匹配任何空白字符,

  \S  匹配任何非空白字符,

  \w  匹配任何字母数字字符,相当于[a-zA-Z0-9]

 \W 匹配任何非字母数字字符,相当于[^a-zA-Z0-9]

 \\   匹配"\"

 \( \) 分组后项引用  \1 引用第一个左括号以及与之对应的右括号所包括的所有内容。    \2 \3 …

 

扩展正则表达式中增加了几个与正则表达式有区别的新内容:

     匹配其前面的字符至少1       \{1,\}正则中近似

     匹配紧挨在其前面的字符0次或1   \?正则中

    {m,n}  匹配前面字符至少m次至多n {1}表示1至无限 {0,3}表示0-3

    分组  \1 \2 \3 …

     |  或者

 

2.  举例说明


这里的-n显示了行号 n.表示n后面跟0-1个字符

wKioL1SUSfjS05fuAADZNPpl1cE744.jpg

\.转义符

wKioL1SUSgqRyIXUAACcNfkYMBg951.jpg

这里的-i忽略了匹配字符的大小写 o后面跟了3个字符被匹配到

wKiom1SUSXeCkAkZAADUVrPd5ug863.jpg

-v忽略匹配项

wKioL1SUSi-h2_nkAACX7AkwAxc730.jpg

 nt* 表示匹配以n为开头后面可以没有t个字符,也可以出现多次

wKiom1SUSaSDSpeXAADPKDmldEk912.jpg

匹配on后面跟的任意长度字符

wKioL1SUSlrz_CNLAACR5xQzoCM622.jpg

虽然可以用wc –l 显示行号但是比起-c来说慢了一点!-w匹配单词

wKiom1SUSi_DKbSuAAD2gp9Mklg600.jpg

锚定行首

wKioL1SUSpLQgbxaAAB_k3dkYGc250.jpg

列出非目录的行 total是啥?

wKiom1SUSuHA7qqxAAIUrhY8Cw8773.jpg

锚定行尾

wKioL1SUS5-BVf40AAE7k2yva0w770.jpg

查找目录下文件中匹配的词

wKiom1SUSxyjm1zLAAGdMpgt8E0770.jpg

wKioL1SUS8CDyBinAADSqORWaEw570.jpg

wKiom1SUSxyAEYKEAADW5efuNz0613.jpg


锚定词首

wKiom1SUS0aycsgcAAFVq_-IUqw228.jpg

锚定词尾

wKiom1SUS46TUkCSAAFjFRSA77s489.jpg

/etc/passwd文件中查找匹配o,并且至少出现2次的字符串的行。

wKioL1SUTATRxJGgAAFYDUVqoMs179.jpg

显示文件中任意数字,左右有:号

wKioL1SUTEugsy5kAAFRQPoHwK0937.jpg

显示以#开头的行后面跟一个或多个空白字符,且后面跟了任意非空白字符的行

wKioL1SUTGSxB5KXAAI3uSMBRAk120.jpg

显示非数字字母的字符

wKioL1SUTH6wfBoCAAG_BzETnvw261.jpg

分组中grepegrep的区别

wKiom1SUS_fxCq4gAAIjc8tgmp0627.jpg

显示root开头或bash结尾的行(扩展正则表达式独有)

wKiom1SUTDHTXVXsAAFJArdytSw021.jpg

这个7在文件内没有返回值为1,若是6在文件内有则返回0,大该编程有用吧!

wKioL1SUTLfyK8dlAAFUwi6B7ys462.jpg

演示到这里我的color没有在命令中显示为何会展示出颜色呢?其实我用的是alias别名啦,如图所示:  当然可以不用别名,在grep前面加个即可。

wKioL1SUTPTRrhUGAADlV9b0PKQ976.jpg


    fgrep不支持正则表达式也就不举例了。虽然例子不多也比较基础,以后还会补上点实用的内容。若有不对请指出!


补充内容:

懒惰限定符

*?         重复任意次,但尽可能少重复

+?         重复1次或更多次,但尽可能少重复

??         重复0次或1次,但尽可能少重复

{n,m}?     重复nm次,但尽可能少重复

{n,}?      重复n次以上,但尽可能少重复


通配符:globbing

* 任意长度任意字符

? 任意单个字符

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

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

纯数字    [[:digit:]][0-9]

小写字母  [[:lower:]][a-z]

大写字母  [[:upper:]][A-Z]

大小写字母 [[:alpha:]][a-zA-Z]

数字加字母 [[:alnum:]][0-9a-zA-Z]

空白字符  [[:space:]]  非空白字符[^[:space:]]

标点符号  [[:punct:]][^a-zA-Z0-9]





为何我们五年前不曾相遇?