一、grep
grep
Global search REgular expression and Print out the line.
文本搜索工具,根据用户指定的文本"模式"(pattern,正则表达式元字符及正常字符组成而成)对目标文件进行逐行搜索,显示匹配到的行
没有匹配到,则没有输出,此时$?的值不为0,脚本里常使用这个特性加-q来判断某某是否存在
grep [OPTIONS]... [PATTERN] [FILENAME]...
--color[=auto] #对匹配到的字符串作高亮显示
-i #忽略大小写
-v #仅显示匹配不到行
-o #仅显示匹配到的字符串
-c #统计匹配到的行,输出的是行数
-q #静默模式
-n #显示其在原文件中的行号
-A N #显示匹配到的行及其下面的N行
-B N #显示匹配到的行及其上面的N行
-C N #显示匹配到的行及其上N行和下N行
-E #支持扩展正则表达式
-P, --perl-regexp PATTERN 是一个 Perl 正则表达式
Perl风格的RE就比GRU BRE或ERE多个\d,\D,[\w\s\d],不支持\<,可以使用\b,暂时只知道这些
egrep 相当于 “grep -E”支持扩展正则表达式
fgrep 相当于 “grep” 但不支持正则表达式,任何字符都使用它本身,没有特殊含义,查找速度更快
二、练习题
1、显示/etc/passwd文件中以bash结尾的行
2、显示/etc/passwd文件中的两位数或三位数
3、显示`netstat -tan`命令结果中以‘LISTEN’后跟0个、1个或者多个空白字符结尾的行、
4、添加用户bash、testbash、basher以及nologin用户(nologin用户的shell为/sbin/nologin);而后找出/etc/passwd文件中用户名与其shell名相同的行
5、显示当前系统上root、centos或者user1用户的默认shell和UID (请事先创建这些用户,若不存在)
6、找出/etc/rc.d/init.d/functions文件中某单词(单词中间可以存在下划线)后面跟着一组小括号的行
7、使用echo输出一个路径,而后egrep找出其路径基名要注意基名后面有没有“/”有则去掉;进一步的使用egrep取出其目录名
[root@Node3 ~]# echo "/etc/sysconfig/network-scripts/"|grep -Eo '[^/]*/?$'|grep -Eo '.*[^/]' network-scripts [root@Node3 ~]# echo "/etc/sysconfig/network-scripts"|grep -Eo '[^/]*/?$'|grep -Eo '.*[^/]' network-scripts [root@Node3 ~]# echo "/etc/sysconfig/network-scripts"|grep -oE '.*/' /etc/sysconfig/ [root@Node3 ~]# echo "/etc/sysconfig/network-scripts/" #这个怎么取? [root@Node3 ~]# echo "/etc/sysconfig/network-scripts"|grep -oE '.*/.'|grep -Eo '.*/' /etc/sysconfig/ #只会用多次的办法, /etc/sysconfig/ [root@Node3 ~]# echo "/etc/sysconfig/network-scripts/"|grep -oE '.*/.'|grep -Eo '.*/' /etc/sysconfig/ [root@Node3 ~]#
8、找出ifconfig命令执行结果中1-255之间的数字
[root@Node3 ~]# ifconfig|grep -Po '\b[1-9]\b|\b[1-9]\d\b|\b1\d\d\b|\b2[0-4]\d\b|\b25[0-5] #注意这里需要分段来匹配 [1-9]:1-9的数 [1-9]\d:10-99的数 1\d\d:100-199的数 2[0-4][0-9]:200-249的数 25[0-5]:的数
9、写一个模式,能匹配合理的IP地址
这个跟上面的一样,就是细心点
10、写一个模式,能匹配出所有的邮件地址
这个其实很容易,只要了解Email的规则就可以了(不保证这个规则是正确的,就网上随便百度的)
local-part@domain
local-part最长64,domain最长253,总长最长256 |
local-part可以使用任意ASCII字符: |
大小写英文字母 a-z,A-Z |
数字 0-9 |
字符 !#$%&'*+-/=?^_`{|}~ |
字符 .不能是第一个和最后一个,不能连续出现两次 |
但是有些邮件服务器会拒绝包含有特殊字符的邮件地址 |
domain(域名)仅限于26个英文字母、10个数字、连词号- |
连词号-不能是第一个字符 |
顶级域名(com、cn等)长度为2到6个 |
[root@Node3 ~]# echo "xie_xi#e-s.b@bai-y_un.com"|grep -Po --color '^[^.@][^@]+[^.@]@\w[\w-]+\.[[:alpha:]]{2,6}' xie_xi#e-s.b@bai-y_un.com