Linux正则表达式grep与egrep

正则表达式:它是指一个用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串。在很多文本编辑器或其他工具里,正则表达式通常被用来检索或替换那些符合某个模式的文本内容。
其实正则表达式,只是一种思想,一种表示方法。只要我们使用的工具支持表示这种思想那么这个工具就可以处理正则表达式的字符串。常用的工具有grep, sed, awk,这三个都是针对文本的行才操作的。

grep  过滤器
语法: grep  [-cinvABC]  'word'  filename

-n    显示行号
-c    count统计符合要求的行数
-v    取反,不包含所选字符的
-i    不区分大小写
-r    会把目录下面所有的文件遍历  例如: grep -r 'root' ./
-A    后面跟数字,A2表示打印符合要求的行及下面二行
-B    后面跟数字,B2表示打印符合要求的行及上面二行
-C    后面跟数字,C2表示打印符合要求的行及上下各二行
^    行首,开头
$    行尾,结尾
空行用 ^$ 表示

可以做一个别名alias grep="grep --color" 写入到.bashrc里面;以后输入grep命令时查找的关键字符会颜色显示,方便区分。

过滤带有某个关键词的行并输出行号,颜色显示关键词
[root@localhost ~]# grep -n --color 'root' passwd 
1:root:x:0:0:root:/root:/bin/bash
11:operator:x:11:0:operator:/root:/sbin/nologin
[root@localhost ~]# grep -o --color 'root' passwd | wc -l
4

加-o 统计包含关键词的个数;

过滤不带有某个关键词的行,并输出行号;
[root@ linuxidc.com ~]# grep -nv 'nologin' /etc/passwd
1:root:x:0:0:root:/root:/bin/bash
6:sync:x:5:0:sync:/sbin:/bin/sync
7:shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8:halt:x:7:0:halt:/sbin:/sbin/halt
20:user1:x:600:501::/home/user1:/bin/bash
23:MySQL:x:27:27:MySQL Server:/var/lib/mysql:/bin/bash

过滤以nologin结尾的,系统禁止登陆的所有用户;
[root@localhost ~]# grep 'nologin$' /etc/passwd
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin

示例,打印关键字halt所在行的A2 B2 C2
[root@ linuxidc.com ~]# grep -A2 'halt' passwd 
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
[root@ linuxidc.com ~]# grep -B2 'halt' 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@ linuxidc.com ~]# grep -C2 'halt' 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
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin

把所有以#号开头的行去除

[root@ linuxidc.com ~]# grep -v '^#' /etc/inittab 
id:3:initdefault:

去除所有空行和以#号开头的行

[root@ linuxidc.com ~]# grep -v '^#' /etc/crontab |grep -v '^$'
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

示例说明,打印数字或字母开头,及不是字母和数字开头的;
[root@ linuxidc.com tmp]# cat test.txt 
helloworld
abc
abc11111
#differt
12345
67899
123def

[0-9]代表任意一个数字,整个命令意思筛选出包含任意一个数字的行;

[root@ linuxidc.com tmp]# grep '[0-9]' test.txt 
abc11111
12345
67899
123def

[^0-9]代表除0-9之外的任意一个字符,整个命令的意思是筛选出不包含数字的行;

[root@ linuxidc.com tmp]# grep '[^0-9]' test.txt 
helloworld
abc
abc11111
#differt
123def

^[^0-9]代表不是数字开头的;

[root@ linuxidc.com tmp]# grep '^[^0-9]' test.txt 
helloworld
abc
abc11111
#differt

[a-z]代表任意一个英文字母;

[root@ linuxidc.com tmp]# grep '[a-z]' test.txt 
helloworld
abc
abc11111
#differt
123def

[^a-z]代表除英文字母以外的;

[root@ linuxidc.com tmp]# grep '[^a-z]' test.txt 
abc11111
#differt
12345
67899
123def

^[^a-z]代表不是英文字母开头的文本;

[root@ linuxidc.com tmp]# grep '^[^a-z]' test.txt 
#differt
12345
67899
123def

[ ] 如果是数字的话就用[0-9]这样的形式,当然有时候也可以用这样的形式[15]即只含有1或者5,注意,它不会认为是15。如果要过滤出数字以及大小写字母则要这样写[0-9a-zA-Z]。另外[ ]还有一种形式,就是[^字符] 表示除[ ]内的字符之外的字符。

过滤任意一个字符与重复字符
[root@ linuxidc.com ~]# grep 'h..t' /etc/passwd
halt:x:7:0:halt:/sbin:/sbin/halt

'.'点表示任意的一个字符,上面例子为把符合h与t之间有2个任意字符的行过滤出来。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/16447.html