一、grep文本过滤工具
工作特性:根据用户指定的“模式(过滤条件)”对目标文本逐行进行匹配检查;打印匹配到的行;·
用法: grep [OPTIONS] PATTERN[FILE...]
            egrep [OPTIONS] PATTERN[FILE...]
常用选项:
      -E :开启扩展(Extend)的正则表达式。
   -i :忽略大小写(ignore case)。
   -v :反过来(invert),只打印没有匹配的,而匹配的反而不打印。
      -n :显示行号
   -w :被匹配的文本只能是单词,而不能是单词中的某一部分,如文本中有liker,而我搜寻的只是like,就可以使用-w选项来避免匹配liker
      -c :显示总共有多少行被匹配到了,而不是显示被匹配到的内容,注意如果同时使用-cv选项是显示有多少行没有被匹配到。
      -o :只显示被模式匹配到的字符串。
   --color :将匹配到的内容以颜色高亮显示。
            -A n:显示匹配到的字符串所在的行及其后n行,after
            -B n:显示匹配到的字符串所在的行及其前n行,before
            -C n:显示匹配到的字符串所在的行及其前后各n行,context

二、查找条件
1.基本正则表达式元字符
字符匹配:
.:匹配任意单个字符;
[]:匹配指定范围内的任意单个字符;
[^]:匹配指定范围外的任意单个字符;
[:digit:] 所有数字 、[:lower:] 所有小写字母、[:upper:] 所有大写字母、[:alpha:] 所有字母、
[:alnum:]所有字母和数字 、[:punct:] 所有标点符号 、[:space:] 所有空白符号 。

匹配次数:用在要指定其出现的次数的字符的后面,用于限制其前面字符出现的次数;默认工作于贪婪模式;
*:匹配其前面的字符任意次;0,1,多次;
.*:匹配任意长度的任意字符
\?:匹配其前面的字符0次或1次;即其前面的字符是可有可无的;
\+:匹配其前面的字符1次或多次;即其面的字符要出现至少1次;
\{m\}:匹配其前面的字符m次;
\{m,n\}:匹配其前面的字符至少m次,至多n次;
\{0,n\}:至多n次
\{m,}:至少m次

位置锚定:
^:行首锚定;用于模式的最左侧;
$:行尾锚定;用于模式的最右侧;
^PATTERN$:用于PATTERN来匹配整行;
^$:空白行;
^[[:space:]] *$:空行或包含空白字符的行;
单词:非特殊字符组成的连续字符(字符串)都称为单词;
\<或\b:词首锚定,用于单词模式的左侧;
\>或\b:词尾锚定,用于单词模式的右侧;
\<PATTERN\>:匹配完整单词;

三、经典类型练习
1、显示/etc/passwd文件中不以/bin/bash结尾的行;
grep -v “/bin/bash$” /etc/passwd
2、找出/etc/passwd文件中的两位数或三位数;
grep "\<[0-9]\{2,3\}\>" /etc/passwd
3、找出/etc/rc.d/rc.sysinit或/etc/grub2.cfg文件中,以至少一个空白字符开头,且后面非空白字符的行;
grep "^[[:space:]]\+[^[:space:]]" /etc/grub2.cfg
4、找出"netstat -tan"命令的结果中以'LISTEN'后跟0、1或多个空白字符结尾的行;
netstat -tan | grep "[[:space:]]*$"
5、找出/proc/meminfo文件中, 所有以大写或小写s开头的行; 至少有三种实现方式;
grep -i "^s" /proc/meminfo
grep "^[sS] "/proc/meminfo
grep -E "^(s|S) "/proc/meminfo
6、显示当前系统上root、centos或user1用户的相关信息;
grep -E "^(root|centos|user 1) \>" /etc/passwd
7、找出/etc/rc.d/init.d/functions文件中某单词后面跟一个小括号的行;
grep -E -o "[[:alnum:]] +\(\) "/etc/rc.d/init.d/functions
8、使用echo命令输出一绝对路径,使用egrep取出基名;
echo/etc/sysconfig/ | grep -E -o“[^/] +/?$”
进一步:取出其路径名; 类似于对其执行dirname命令的结果;
echo "/etc/rc.d/init.d/functions" | grep -Eo "^[/][a-z0-9]+.*/"
9、找出Ifconfig命令结果中的1-255之间的数值;
fconfig | egrep -o "\<[1-9]\>|\<[1-9][0-9]\>|\<[1][0-9][0-9]\>|\<[2][0-4][0-9]\>|\<[2][0-5][0-5]\>"
10、写一个模式,能匹配合理的IP地址;1.0.0.0-255.255.255.255
egrep "(\<[1-9]\>|\<[1-9][0-9]\>|\<[1][0-9][0-9]\>|\<[2][0-4][0-9]\>|\<[2][0-5][0-5]\>)\.(\<[1-9]\>|\<[1-9][0-9]\>|\<[1][0-9][0-9]\>|\<[2][0-4][0-9]\>|\<[2][0-5][0-5]\>\.)\.(\<[1-9]\>|\<[1-9][0-9]\>|\<[1][0-9][0-9]\>|\<[2][0-4][0-9]\>|\<[2][0-5][0-5]\>)\.(\<[1-9]\>|\<[1-9][0-9]\>|\<[1][0-9][0-9]\>|\<[2][0-4][0-9]\>|\<[2][0-5][0-5]\>)"

11、添加用户bash, testbash, basher以及no login(其shell为/sbin/no login) ; 而后找出/etc/passwd文件中用户名同shell名的行;
useradd bash
useradd testbash
useradd basher
useradd -s /sbin/nologin nologin
grep -P '^(\b(\w+)\b).*\1$' /etc/passwd
12.写一个模式,能匹配出所有的邮件地址;
grep -E "^[a-z0-9_-]+@[a-z0-9_-]+.[[:alpha:]]+$"

四、fgrep拓展
工作特性:不支持正则表达式元字符;当无需要用到元字符去编写模式时,使用fgrep必能更好;