标签:正则 grep
一、正则表达式 正则表达式,又称正规表示式、正规表示法、正规表达式、规则表达式、常规表示法(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。——维基百科 正则表达式是计算机智能的一种体现,她能让我们在繁杂的计算机文本之中找到我们最想要的东西,在她那规则而又朦胧的面纱之下是一张优雅而又调皮的面孔,对于初入Linux大门的男人来说,无不拜倒在她的石榴裙下,而本文所要做的就是如何俘获她的芳心。 1、了解她的身世 在1956 年,美国的一位名叫Stephen Kleene的数学科学家,他在Warren McCulloch和Walter Pitts早期工作的基础之上,发表了一篇题目是《神经网事件的表示法》的论文,利用称之为正则集合的数学符号来描述此模型,引入了正则表达式的 概念。正则表达式被作为用来描述其称之为“正则集的代数”的一种表达式,因而采用了“正则表达式”这个术语。之后一段时间,人们发现可以将这一工作成果应用于其他方面。Ken Thompson就把这一成果应用于计算搜索算法的一些早期研究,Ken Thompson是 Unix的主要发明人,也就是大名鼎鼎的Unix之父。Unix之父将此符号系统引入编辑器QED,然后是Unix上的编辑器ed,并最终引入grep。近二十年来,在WINDOW的阵营下,正则表达式的思想和应用在大部分 Windows 开发者工具包中得到支持和嵌入应用!目前主流的开发语言(PHP、C#、Java、C++、VB、Javascript、Ruby以及python等)、数以亿万计的各种应用软件中,都可以看到正则表达式优美的舞姿。 2、经常使用的正则表达式元字符 * 0个或多个在*字符之前的那个普通字符 . 匹配任意一个字符 .* 贪婪匹配 ^ 匹配行首 $ 匹配行尾 ^$ 匹配空白行 [] 匹配指定范围内的任意单个字符 [^] 匹配指定范围外的任意单个字符 \ 转义符,屏蔽一个元字符的特殊意义 <\> 精确匹配符号 \{n\} 匹配前面字符出现n次 \{n,\} 匹配前面字符至少出现n次 \{n,m\} 匹配前面字符出现n~m次 ? 匹配0个或一个在其之前的那个普通字符 + 匹配一个或多个在其之前的那个普通字符 () 表示一个字符集合或用在expr中 | 表示“或”匹配一组可选的字符 [0-9] [[:digit:]] [^0-9] [^[:digit:]] [a-z] [[:lower:]] [A-Z] [[:upper:]] 空格或者tab键 [[:space:]] [0-9a-zA-Z] [[:alnum:]] [a-zA-Z] [[:alpha:]] 二、关于grep 命令 grep: 默认支持基本正则表达式; egrep: 扩展正则表达式; fgrep: 不支持正则表达式元字符,搜索字符串的速度快,等同於grep -F 语法: grep [-cinvABC] ‘word‘ filename -c :打印符合要求的行数 -n :在输出符合要求的行的同时连同行号一起输出 -v :打印不符合要求的行 -A :后跟一个数字(有无空格都可以),例如 –A2则表示打印符合要求的行以及下面两行 -B :后跟一个数字,例如 –B2 则表示打印符合要求的行以及上面两行 -C :后跟一个数字,例如 –C2 则表示打印符合要求的行以及上下各两行 -r : 会把目录下面所有的文件全部遍历 --color:可以将过滤输出目标的添加颜色 -o 只显示被模式匹配到的字串,而不是整个行。 在使用grep 命令时可以做一个别名alias grep="grep --color" 写入到.bashrc里面,今后在使用grep命令查找关键字就会显示颜色了。 1.过滤以root开头和以nologin结尾的行并显示行号 [root@hpf-linux 222]# grep -n ‘^root‘ passwd 1:rootmail:x:0:0:root:/root:/bin/bash [root@hpf-linux 222]# grep -n ‘nologin$‘ passwd 2:bin:x:1:1:bin:/bin:/sbin/nologin 3:daemon:x:2:2:daemon:/sbin:/sbin/nologin ............. 2.grep ‘^[^a-zA-Z]‘与 grep -v ‘^[a-zA-Z]‘俩的区别 [root@hpf-linux 222]# grep ‘^[^a-zA-Z]‘ /etc/crontab # For details see man 4 crontabs # Example of job definition: # .---------------- minute (0 - 59) # | .------------- hour (0 - 23) # | | .---------- day of month (1 - 31) # | | | .------- month (1 - 12) OR jan,feb,mar,apr ... # | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat # | | | | | # * * * * * user-name command to be executed [root@hpf-linux 222]# grep -v ‘^[a-zA-Z]‘ !$ grep -v ‘^[a-zA-Z]‘ /etc/crontab # For details see man 4 crontabs # Example of job definition: # .---------------- minute (0 - 59) # | .------------- hour (0 - 23) # | | .---------- day of month (1 - 31) # | | | .------- month (1 - 12) OR jan,feb,mar,apr ... # | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat # | | | | | # * * * * * user-name command to be executed 从以上例子中可以得出结论:带-v的选项可以过滤出空格行而不带则不能过滤; 3.使用-A -B -C选项举例 [root@hpf-linux 222]# grep -A2 ‘sync‘ passwd sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt [root@hpf-linux 222]# grep -B2 ‘sync‘ passwd adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync [root@hpf-linux 222]# grep -C2 ‘sync‘ passwd adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt 4.打印数字或字母开头,以及不是字母和数字开头的文件内容 [root@hpf-linux 222]# cat test.txt 32534 34 575 @fhfhhj ^&^%#% h45654 3221jty [0-9] 只要该行有数字均会显示出 [root@hpf-linux 222]# grep ‘[0-9]‘ test.txt 32534 34 575 h45654 3221jty ^[0-9] 只会显示以数字开头的行 [root@hpf-linux 222]# grep ‘^[0-9]‘ test.txt 32534 34 575 3221jty [^0-9] 只要该行没有数字均会显示出 [root@hpf-linux 222]# grep ‘[^0-9]‘ test.txt 34 575 @fhfhhj ^&^%#% h45654 3221jty ^[^0-9] 只会显示以非数字开头的行 [root@hpf-linux 222]# grep ‘^[^0-9]‘ test.txt @fhfhhj ^&^%#% h45654 [a-z]、^[a-z]、[^a-z]、^[^a-z]、[A-Z]、^[A-Z]、[^A-Z]、^[^A-Z] 这些选项与数字大概意思差不多,今后只要记住 [ - ] 只要该行有中括号范围内内容均会显示,^[ - ]显示以中括号范围内内容开头的行 [^ - ]只要该行没有中括号范围内内容均会显示,^[^ - ]显示以中括号范围内内容以外开头的行 5.关于-o选项与-c选项的使用与区别 -o 只显示被模式匹配到的字串,而不是整个行。 -c 打印符合要求的行数 从字义上可以理解为:-o为找出匹配字符串的个数通常可以与wc -l一块使用而可以找出该文件一共有多少个关键字,而-c则是打印出有总共有多少行包含关键字,从而可以说明-o 的输出数据会大于等于-c输出的数据,因为一行可以有一个或者多个关键字,请看例子: [root@hpf-linux 222]# grep -c ‘root‘ passwd 2 [root@hpf-linux 222]# grep -o ‘root‘ passwd root root root root [root@hpf-linux 222]# grep -o ‘root‘ passwd |wc -l 4 [root@hpf-linux 222]# grep ‘root‘ passwd rootmail:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin 6.关于.、*、.*的使用 .是表示任意一个字符 [root@hpf-linux 222]# grep ‘r..t‘ passwd rootmail:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin *是表示0个或者多个*前面的字符 [root@hpf-linux 222]# grep ‘ro*t‘ passwd rootmail:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin vcsa:x:69:69:virtual conro,tsole memory owner:/dev:/sbin/nologin roooooooooooooot roooot .*是贪婪匹配可以表示任意个任意字符 [root@hpf-linux 222]# grep ‘r.*t‘ passwd rootmail:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin vcsa:x:69:69:virtual conro,tsole memory owner:/dev:/sbin/nologin 7.由于有些字符选项(+、{、}、?、|等)grep不支持只能用脱意字符\或者在grep后面加-E选项才能使用,如果不想用上两种方法这可以用egrep命令来替代同时egrep命令也支持带颜色显示; + 选择一个或者一个以上前面的内容 [root@hpf-linux 222]# egrep ‘ro+t‘ passwd rootmail:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin rooooot rot ? 零个或者一个前面的内容 [root@hpf-linux 222]# egrep ‘ro?t‘ passwd vcsa:x:69:69:virtual conro,tsole memory owner:/dev:/sbin/nologin rot | 或者的一时可以显示两边任意一个字符,为避免发生歧义一定要使用()将所需选择的内容括起来 [root@hpf-linux 222]# egrep ‘ro|at‘ passwd --color rootmail:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin vcsa:x:69:69:virtual conro,tsole memory owner:/dev:/sbin/nologin saslauth:x:499:76:Saro tslauthd user:/var/empty/saslauth:/sbin/nologin postfix:x:89:89:roat:/var/spool/postfix:/sbin/nologin [root@hpf-linux 222]# egrep ‘r(o|a)t‘ passwd --color operator:x:11:0:operator:/root:/sbin/nologin sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin rot {n} 该选项会匹配中括号前面的字符出现n次 [root@hpf-linux 222]# egrep ‘ro{1}t‘ passwd rot [root@hpf-linux 222]# egrep ‘ro{2}t‘ passwd rootmail:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin [root@hpf-linux 222]# egrep ‘ro{1,2}t‘ passwd rootmail:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin rot [root@hpf-linux 222]# egrep ‘ro{2,}t‘ passwd rootmail:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin roooooooooooooot 参考文档: http://linuxlover.blog.51cto.com/2470728/1629038
标签:正则 grep
原文地址:http://9950284.blog.51cto.com/9940284/1631647