一、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