功能:输入文件的每一行中查找字符串。并把匹配的行打印出来。
grep的工作方式是这样的,它在一个或多个文件中搜索字符串模板。如果模板包括空格,则必须被引用,模板后的所有字符串被看作文件名。搜索的结果被送到屏幕,不影响原文件内容。
grep可用于shell脚本,因为grep通过返回一个状态值来说明搜索的状态,如果模板搜索成功,则返回0,如果搜索不成功,则返回1,如果搜索的文件不存在,则返回2。我们利用这些返回值就可进行一些自动化的文本处理工作。
grep -[acinvo] '搜索内容串' filename
1.对文本进行行过滤
-v--对其匹配到的行取反
-i--忽略大小写
-n 显示匹配到的行号
-c 匹配的行数
-o 仅显示匹配到的字符串
-q 静默 不输出任何信息 与echo $? ——> 0有 1无
-W 匹配整个单词 ---- 单词不能接数字、字母、汉字、下划线(_) 否则不能算完整单词
-A,B,C后面数字
2.元字符分类:字符匹配、匹配次数、位置锚定、分组
字符匹配:
. 匹配任意单个字符
[] 匹配指定范围内的任意单个字符 [ ]内字符不用转义如. /
[^] 匹配指定范围外的任意单个字符
[:alnum:] 字母和数字
[:alpha:] 代表任何英文大小写字符,亦即 A-Z, a-z
[:lower:] 小写字母
[:upper:] 大写字母
[:blank:] 空白字符(空格和制表符)
[:space:] 水平和垂直的空白字符(比[:blank:]包含的范围广)
[:cntrl:] 不可打印的控制字符(退格、删除、警铃...)
[:digit:] 十进制数字 [:xdigit:]十六进制数字
[:graph:] 可打印的非空白字符
[:print:] 可打印字符
[:punct:] 标点符号
匹配次数:用在要指定次数的字符后面,用于指定前面的字符要出现的次数
* 匹配前面的字符任意次,包括0次 贪婪模式:尽可能长的匹配
.* 任意长度的任意字符
\? 匹配其前面的字符0或1次
\+ 匹配其前面的字符至少1次
\{n\} 匹配前面的字符n次
\{m,n\} 匹配前面的字符至少m次,至多n次
\{,n\} 匹配前面的字符至多n次
\{n,\} 匹配前面的字符至少n次
位置锚定:定位出现的位置
^ 行首锚定,用于模式的最左侧
$ 行尾锚定,用于模式的最右侧 ^PATTERN$ 用于模式匹配整行
^$ 空行 ^[[:space:]]*$ 空白行
\< 或 \b 词首锚定,用于单词模式的左侧
\> 或 \b 词尾锚定;用于单词模式的右侧 \<PATTERN\> 匹配整个单词
分组:
\(\) 将一个或多个字符捆绑在一起,当作一个整体进 行处理,如:\(root\)\+ v
分组括号中的模式匹配到的内容会被正则表达式引擎记录于 内部的变量中,这些变量的命名方式为: \1, \2, \3, ... v\1 表示从左侧起第一个左括号以及与之匹配右括号之间的 模式所匹配到的字符 v 示例: \(string1\+\(string2\)*\) \1 : string1\+\(string2\)* \2 :string2 v
后向引用:引用前面的分组括号中的模式所匹配字符,而非 模式本身 v 或者:\| 示例:a\|b: a或b C\|cat: C或cat \(C\|c\)at:Cat或cat
这里列出几个扩展特殊符号:
+,于 . * 作用类似,表示 一个或多个重复字符。
?, 于 . * 作用类似,表示0个或一个字符。
|,表示或关系,比如 'gd|good|dog' 表示有gd,good或dog的串
(),将部分内容合成一个单元组。比如 要搜索 glad 或 good 可以这样 'g(la|oo)d'
()的好处是可以对小组使用 + ? * 等。
比如要搜索A和C开头结尾,中间有至少一个(xyz) 的串,可以这样 : 'A(xyz)+C'
示例
1.显示/proc/meminfo文件中以大小s开头的行(要求:使用两 种方法)
[root@zab ~]# egrep -i ^[s] /proc/meminfo
egrep "^[sS]" /proc/meminfo
2.显示/etc/passwd文件中不以/bin/bash结尾的行
egrep -v "/bin/bash$" /etc/passwd
3.找出/etc/passwd中的两位或三位数
[root@centos7 ~]#grep "\<[[:digit:]]\{2,3\}\>" /etc/passwd
egrep "[0-9]{2,3}\>" /etc/passwd
4.显示用户rpc默认的shell程序
[root@centos7 ~]# cat /etc/passwd |egrep "\<rpc\>" |cut -d: -f7
grep -w "^rpc" /etc/passwd |cut -d: -f7
grep "^rpc\>" /etc/passwd |cut -d: -f7
5.显示CentOS7的/etc/grub2.cfg文件中,至少以一个空白 字符开头的且后面存非空白字符的行
[root@centos7 ~]# egrep "^[[:space:]]{1,}[^[:space:]"] /etc/grub2.cfg
[root@centos7 ~]# egrep "^[[:space:]]+[^[:space:]]" /etc/grub2.cfg
6.找出“netstat -tan”命令的结果中以‘LISTEN’后跟任意多 个空白字符结尾的行
netstat -tan | grep "\(LISTEN\)\[[:space:]]*$"
[root@centos7 ~]# netstat -tan |egrep "(LISTEN)[[:space:]]*$"
7.显示CentOS7上所有系统用户的用户名和UID
[root@centos7 ~]# cat /etc/passwd|egrep "\<[0-9]{1,3}\>"|cut -d: -f1,3
注:在centos7上系统用户的uid为0-999
[root@centos7 ~]# cat /etc/passwd|egrep "\<[0-9]{1,3}\>"|cut -d: -f1,3
[root@centos7 ~]# cut -d: -f1,3 /etc/passwd |egrep "\<[[:digit:]]{1,3}$"
8.添加用户bash、testbash、basher、sh、nologin(其shell 为/sbin/nologin),找出/etc/passwd用户名同shell名的行
[root@centos7 ~]# cat /etc/passwd |egrep "^([[:alnum:]]+\>).*\1$"
[root@centos7 ~]# cat /etc/passwd |egrep "^([a-zA-Z]+\>).*\1$" shell类型只含字母
9.利用df和grep,取出磁盘各分区利用率,并从大到小排序
[root@centos7 ~]# df -h |egrep "^/dev/sda" |egrep -o "([0-9]{,2}|100)%"
[root@centos7 ~]# df |grep "^/dev/sd" | grep -o "\<[[:digit:]]\+%" |sort -nr|tr -d "%"
10.显示三个用户root、mage、wang的UID和默认shell默认shell
[root@centos7 ~]# cat /etc/passwd |egrep "^(mage|wang|root)\>"|cut -d: -f1,7
11.找出/etc/rc.d/init.d/functions文件中行首为某单词(包 括下划线)后面跟一个小括号的
[root@centos7 ~]# cat /etc/rc.d/init.d/functions|egrep "^[[:alnum:]|_]{1,}\(\)"
12.使用egrep取出/etc/rc.d/init.d/functions中其基名
[root@centos7 ~]# echo /etc/rc.d/init.d/functions|egrep -o "[^/]+$"
13.使用egrep取出上面路径的目录名
[root@centos7 ~]# echo /etc/rc.d/init.d/functions|egrep -o "^/.*/\<"
14.统计last命令中以root登录的每个主机IP地址登录次数
[root@centos7 ~]# last|egrep -w "root"|egrep "([0-9]{1,3}\.){3}[0-9]{1,3}"|tr -s ' '|cut -d' ' -f1,3|sort |uniq -c
15.利用扩展正则表达式分别表示0-9、10-99、100-199、 200-249、250-255 v
[0-9] [1-9][0-9] 1[0-9][0-9] 2[0-4][0-9] 25[0-5]
16.显示ifconfig命令结果中所有IPv4地址
[root@centos7 ~]# ifconfig| egrep "\<(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>"
17.将此字符串:welcome to magedu linux 中的每个字符 去重并排序,重复次数多的排到前面
[root@zab ~]# echo "welcome to magedu linux" |egrep -o "." |sort |uniq -c
18.用正则表达式表示手机号11 13 17 15 18
[root@centos7 ~]# egrep "1[3758][0-9]{9}"
本文转自 工运搬运维 51CTO博客,原文链接:http://blog.51cto.com/13157015/2044460,如需转载请自行联系原作者