正则表达式:是一套处理字符串的规则和方法。以行为单位对字符串进行处理。可以快速过滤替换某些特定字符串。

linux下文本处理的三剑客:

awk   sed   grep(egrep)

 

grep   grep为global search regular expression(RE) and print out the line的缩写,即根据用户指定的文本搜索模式对目标文件进行搜索并显示能够被模式匹配到的行的一种文本搜索工具。

       

grep [OPTIONS] PATTERN [FILE...]

       grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]       grep [OPTIONS] PATTERN [FILE...]

       grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]

 

-i 忽略大小写 
[root@redmine ~]# grep -i --color 'root' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
ROOT
[root@redmine ~]#

 

-c 显示被匹配到的行数 

 

[root@redmine ~]#  grep -c --color 'root' /etc/passwd
2
[root@redmine ~]#

 

-n 输出行号 

 

[root@redmine ~]# grep -n 'root' /etc/passwd
1:root:x:0:0:root:/root:/bin/bash
11:operator:x:11:0:operator:/root:/sbin/nologin

 

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

 

[root@redmine ~]# grep -v '^r' /etc/passwd

 

-o 仅显示匹配到的内容 

 

[root@redmine ~]# grep -o 'root' /etc/passwd
root
root
root
root
[root@redmine ~]#

 

-w 匹配单词 

 

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

[root@redmine ~]# grep -A2 "postfix" /etc/passwd
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
pulse:x:497:496:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
[root@redmine ~]#

 

 

 

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

 

[root@redmine ~]# grep -B2 "postfix" /etc/passwd
apache:x:48:48:Apache:/var/www:/sbin/nologin
saslauth:x:498:76:Saslauthd user:/var/empty/saslauth:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
[root@redmine ~]#

 

 

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

[root@redmine ~]# grep -C2 "postfix"  /etc/passwd
apache:x:48:48:Apache:/var/www:/sbin/nologin
saslauth:x:498:76:Saslauthd user:/var/empty/saslauth:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
pulse:x:497:496:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
[root@redmine ~]#

 

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

[root@redmine etc]# grep -r "yuanyang" /etc/
/etc/passwd:yuanyang
/etc/ssh/sshd_config:yuanyang
[root@redmine etc]#

 

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

 

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

 

--color对匹配的内容以颜色显示,等价于如下命令,在redhat发行版7.0中默认就有,不用额外执行。

[root@redmine ~]# alias grep='grep --color=auto'

 

-V  显示grep版本 

[root@redmine etc]# grep -V

grep (GNU grep) 2.20

Copyright (C) 2014 Free Software Foundation, Inc.

GPLv3+ 许可证: GNU 通用公共许可证第三版或更高版本 <http://gnu.org/licenses/gpl.html>。

这是自由软件: 您可自由更改并重新分发它。

在法律所允许的范围内,不附带任何担保条款。

 

作者 Mike Haertel 和 其余作者请参看 <http://git.sv.gnu.org/cgit/grep.git/tree/AUTHORS>。

 

 

grep中不太常用的选项: 

 

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

 

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

 

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

 

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

 

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

 

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

 

基础正则表达式

1)"^以什么开头的行"

 "^root"以root开头的  如:grep  "^root" /etc/passwd

[root@redmine etc]# grep "root" /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
rootadbed123o
[root@redmine etc]#

 

2)"$"以什么结尾的行

"bash$"以bash结尾的  如:grep  "bash$" /etc/passwd

[root@redmine etc]# grep "bash" /etc/passwd
root:x:0:0:root:/root:/bin/bash
yy:x:500:500:yy:/home/yy:/bin/bash
mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/bash
[root@redmine etc]#

3). 代表任意一个字符      如:grep  "r..t" /etc/passwd

[root@redmine etc]# grep "r..t"  /etc/passwd
root: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
rootadbed123o
raat
[root@redmine etc]#

 

 

4)\              转义符号,让有特殊身份意义的字符还原型。 例:\.

 

5)\.表示.本身   \逃逸符   如:

[root@redmine etc]# grep "^r\." /etc/passwd
r....t
r...
r..bt
[root@redmine etc]#

 

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

[root@redmine etc]# grep "ro\?t" /etc/passwd
vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
rtkit:x:499:497:RealtimeKit:/proc:/sbin/nologin
abrt:x:173:173::/etc/abrt:/sbin/nologin
rot

6)* 重复0个或多个前面的字符。  如:grep  "ro*t" /etc/passwd

[root@redmine etc]# grep 'ro*t' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
rtkit:x:499:497:RealtimeKit:/proc:/sbin/nologin
abrt:x:173:173::/etc/abrt:/sbin/nologin
rooooot
rooot
rootadbed123o
rot
[root@redmine etc]#

7).*匹配所有字符。^.*以任意多个字符开头。

 

8)[]字符集合的重复特殊字符符号   如grep b[lo]g,表示匹配blg或bog

[root@redmine etc]# grep "[Rr].*[tT]" /etc/passwd
root: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 console memory owner:/dev:/sbin/nologin
rtkit:x:499:497:RealtimeKit:/proc:/sbin/nologin
avahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin
abrt:x:173:173::/etc/abrt:/sbin/nologin
saslauth:x:498:76:Saslauthd user:/var/empty/saslauth:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
rooooot
rooot
r....t
ROOOT
ROOT
rOOOt
RoooT
rootadbed123o
raat
rbbbt
r..bt
rot

 

8)[^]匹配不包含^后的任意字符的内容。如[^0-9]表示匹配非数字的内容。

grep '[^0-9]' /etc/passwd  表示匹配文件中所有的非数字内容。

grep '[^a-Z]' /etc/passwd  表示匹配文件中所有非字母的内容。

9)a\{n,m\}  匹配前面的a最少n次,最多m次。,如果用egrep可以去掉斜线

[root@redmine etc]# grep "ro\{1,3\}t" /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
rooot
rootadbed123o
rot
[root@redmine etc]#

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

 

 

  \{n,\}重复前面一个字符至少n次。

[root@redmine etc]# grep 'ro\{3,\}t' /etc/passwd
rooooot
rooot
[root@redmine etc]#

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

  \{n\}重复前面一个字符n次。

[root@redmine etc]# grep 'ro\{3\}t' /etc/passwd
rooot
[root@redmine etc]#

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

 

 x\{1,\} 1次至无上限 

[root@redmine etc]# grep "ro\{1,\}t" /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
rooooot
rooot
rootadbed123o
rot
[root@redmine etc]#

 

 

 

位置锚定:

 

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

 

 

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

 

    ^$表示空行

grep -v '^$' xxx  表示过滤文件中的空行。

 

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

 

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

以上几个位置锚定前面有示例,不再赘述。

 

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

[root@redmine etc]# grep '\<p' /etc/passwd
rtkit:x:499:497:RealtimeKit:/proc:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
pulse:x:497:496:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
[root@redmine etc]# 
[root@redmine etc]# grep '\bp' /etc/passwd
rtkit:x:499:497:RealtimeKit:/proc:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
pulse:x:497:496:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
[root@redmine etc]#

 

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

[root@redmine etc]# grep 't\>' /etc/passwd
root:x:0:0:root:/root:/bin/bash
halt:x:7:0:halt:/sbin:/sbin/halt
operator:x:11:0:operator:/root:/sbin/nologin
rtkit:x:499:497:RealtimeKit:/proc:/sbin/nologin
abrt:x:173:173::/etc/abrt:/sbin/nologin
rooooot
rooot
r....t
rOOOt
raat
rbbbt
r..bt
rot
[root@redmine etc]# grep 't\b' /etc/passwd
root:x:0:0:root:/root:/bin/bash
halt:x:7:0:halt:/sbin:/sbin/halt
operator:x:11:0:operator:/root:/sbin/nologin
rtkit:x:499:497:RealtimeKit:/proc:/sbin/nologin
abrt:x:173:173::/etc/abrt:/sbin/nologin
rooooot
rooot
r....t
rOOOt
raat
rbbbt
r..bt
rot

 

    \<\> 锚定单词例如 \<root\> ,注意,这里的单词和词典上定义的单词概念有所不同。这里的单词是指一个由连续的字母,数字和一些符号组成的字符串。例如:”asd!@#-asd_%123”

[root@redmine etc]# grep '\<asd!@#-asd_%123\>' /etc/passwd
asd!@#-asd_%123

 

字符集合表示:

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

 

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

 

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

 

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

 

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

 

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

 

    标点符号 [[:punct:]] 

 

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

 

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

 

 \s  匹配任何空白字符, 

 

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

 

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

 

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

 

 \\  匹配"\" 

 

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

 

 

 

扩展正则表达式

1)+重复一个或一个以上前面的字符  grep -E 'ro+t' /etc/passwd

[root@redmine etc]# grep -E 'ro+t' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
rooooot
rooot
rootadbed123o
rot

 

2)?重复0个或一个前面的字符

[root@redmine etc]# grep -E 'ro?t' /etc/passwd
vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
rtkit:x:499:497:RealtimeKit:/proc:/sbin/nologin
abrt:x:173:173::/etc/abrt:/sbin/nologin
rot

3)|用或的方式查找多个符合的字符串,如egrep "3306|1521" /etc/service

[root@redmine etc]# grep -E 'root|yuanyang' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
yuanyang
rootadbed123o
[root@redmine etc]#

4)()找出用户组字符串  grep -E 'r(oo|aa)t' /etc/passwd

[root@redmine etc]# grep -E 'r(oo|aa)t' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
rootadbed123o
raat

()+ 多个重复组的判断  匹配 AabcabcabcC 中间abc为多组  grep -E 'A(abc)+C' test

 

 

实例演示:

1.显示/etc/passwd文件中以bash结尾的行

[root@redmine etc]# grep 'bash$' /etc/passwd
root:x:0:0:root:/root:/bin/bash
yy:x:500:500:yy:/home/yy:/bin/bash
mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/bash

 

2.显示/etc/passwd文件中的两位数或三位数

[root@redmine etc]# grep -o --color '[0-9]\{2,3\}' /etc/passwd 
12
10
14
11
12
100
13
30
14
50
99
99

.................由于篇幅问题,后面不列举出来。

 

3.显示`netstat -tan`命令结果中以‘LISTEN’后跟0个、1个或者多个空白字符结尾的行

netstat -tan | grep 'LISTEN[[:space:]]*$'

 

4.添加用户bash、testbash、basher以及nologin用户(nologin用户的shell为/sbin/nologin);而后找出/etc/passwd文件中用户名与其shell名相同的行

 

[root@redmine etc]# useradd bash;useradd testbash;useradd basher;useradd nologin -s /sbin/nologin
[root@redmine etc]# grep -E '(^[[:alnum:]]+\>).*\1$' /etc/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
bash:x:501:501::/home/bash:/bin/bash
nologin:x:504:504::/home/nologin:/sbin/nologin

 

 

5.显示当前系统上root、centos或者user1用户的默认shell和UID (请事先创建这些用户,若不存在)

[root@redmine etc]# useradd centos;useradd user1
[root@redmine etc]#  grep -E '^root|^centos|^user1' /etc/passwd | cut -d: -f1,3,7
root:0:/bin/bash
rootadbed123o
centos:505:/bin/bash
user1:506:/bin/bash

 

 

6.找出/etc/rc.d/init.d/functions文件中某单词(单词中间可以存在下划线)后面跟着一组小括号的行

 

[root@redmine etc]# grep -E '\w+\(\)' /etc/rc.d/init.d/functions 
fstab_decode_str() {
checkpid() {
__readlink() {
__fgrep() {
__umount_loop() {
__umount_loopback_loop() {
__pids_var_run() {
__pids_pidof() {
daemon() {
killproc() {
pidfileofproc() {

..............

 

 

7.使用echo输出一个路径,而后egrep找出其路径基名;进一步的使用egrep取出其目录名

[root@redmine etc]#  echo /etc/init.d/functions | grep -oE '[^/]+/?*$'
functions
[root@redmine etc]# echo /etc/init.d/functions | grep '^[/].*[/]'
/etc/init.d/functions

 

 

 

8.找出ifconfig命令执行结果中1-255之间的数字

[root@redmine etc]# ifconfig | grep -Eo '\<[1-9]\>|\<[0-9\]{2}\>|\<[0-9]{3}\>'