grep命令是linux下的行过滤工具,参数繁多,功能比较强大,用起来比较方便,下面就将grep及其egrep分模块讲述其功能。

1.Grep:根据模式搜索文本,并将符合模式的文本行显示出来

2.Grep的语法:Grep  [option]   PATTERN  [file…] 

  Pattern: 文本字符和正则表达是元字符组合而成匹配条件

3.grep的常用选项:

     -i: 不区分字符的大小写(只适用于单字符);

     -I:字符的大写;

     --color: 匹配的串用高亮颜色显示;   

     alias   grep='grep --color'

     -v: 显示没有被模式匹配到的行;

     -o: 只显示被模式匹配到的字符串;

     -n:显示匹配行及行号;

     -s:不显示不存在或没有匹配文本的错误信息;

     -E:扩展正则表达式;

     -A|B #:显示前(后)两行;

     -C#:前后几行;

     -e: 制定多个匹配模式

 Eg1:在/etc/passwd 下 找到有root 和home关键字并统计下来。

[root@chang ~]# grep -e root -e home -c /etc/passwd

4.基本正则表达式元字符:

4.1 grep字符匹配:

       []:指定范围内的任意单个字符 

       [^]:匹配指定范围外的任意单个字符

 . :匹配任意单个字符

   [:digit:]数字[:space:]空白 [:lower:]小写字母 [:upper:]大写字母 [:alpha:]代表字母 [:alnum:]代表字母与数字字符

4.2 grep匹配次数(贪婪模式):用在要制定次数的字符后面,用于制定前面的字符要出现的次数;

  *:匹配其前面的字符的任意次

  .* :任意长度的任意字符

\?:匹配其前面的字符1次或0次

\+: 匹配其前面的字符至少一次;

\{m\}:匹配前面的字符m次;

\{m,n\}: 匹配其前面的字符至少m次最多n次;( egrep匹配{m,n}时:不再需要\\;)

\{0,n\} :匹配前面的字符最多n次;

      \{m,\} :匹配前面的字符至少m次;   

Eg2:匹配file中a最多3次做少1次的字符

Grep    'a\{1,3\}b'  file

5.grep的位置锚定:

^ :锚定行首,用于模式的最左侧;

$:锚定行尾,用于模式的最右侧;

^PATTERN$ :用于模式匹配整行;

^$:空行     ^[[:space:]]*$

 \<|\b:其后面的任意字符必须作为单词的首部出现(出现单词模式的左侧)即单词的开头;

 \>|\b:其前面的任意字符必须作为单词的尾部出现(出现在单词模式的右侧)即单词的结尾;

 \<PATTERN\>:匹配整个单词;

6.grep的分组:

   \(\)   将一个或多个字符捆绑在一起,当做一个整体进行处理;

 \(ab\)*  :ab可以出现的任意次数

Note :分组括号中的模式匹配到的内容会被正则表达式引擎记录与内部的变量中;这些变量的命令方式为: \1,\2,\3…

   \1:从左侧起,第一个左括号以及与之匹配右括号之间的模式所匹配到的字符;

   \2:第二个。。。

   \3:第三个。。。

以下几个综合性的练习题来练练手:

1>.显示/proc/meminfo文件中以大小s开头的行:

[root@chang ~]# grep '^[Ss]'  /proc/meminfo 

[root@chang ~]# grep -i '^s'  /proc/meminfo

2>.显示/etc/passwd文件中不以/bin/bash结尾的行:

[root@chang ~]# grep -v '/bin/bash$'  /etc/passwd

3>.显示/etc/passwd文件中ID号最大的用户的用户名:

[root@chang ~]# sort -t: -k3 -n /etc/passwd | tail -1 | cut -d: -f1

4>.如果用户root存在,显示其默认的shell程序:

[root@chang ~]# id root &> /dev/null && grep "^root\>" /etc/passwd | cut -d: -f7

/bin/bash

**先判断root用户是否存在,再显示其默认的shell

5>.找出/etc/passwd中的两位或三位数:

[root@chang ~]# grep  "\b[0-9]\{2,3\}\b" /etc/passwd

6>. 显示/etc/rc.d/rc.sysinit文件中,至少以一个空白字符开头的且后面存在非空白字符的行:

[root@chang ~]# grep "^[[:space:]]\+[^[:space:]]"  /etc/rc.d/rc.sysinit

7>.找出“netstat -tan”命令的结果中以‘LISTEN’后跟0、1或多个空白字符结尾的行:

[root@chang ~]# netstat  -tan | grep "LISTEN[[:space:]]*$"

8>. 添加用户bash、testbash、basher以及nologin(其shell为/sbin/nologin):而后找出/etc/passwd文件中用户名同shell名的行:

[root@chang ~]# ls /home

bash  chang  nologin  test  testbash       (已添加所需要的用户)

[root@chang ~]# grep "^\([[:alnum:]]\+\>\).*\1$"  /etc/passwd

7.Grep  -E=egrep

7.2.次数匹配:

         * :

         ?  :0或1次;

         +   :匹配其前面字符至少一次;

7.3.位置锚定:

      其他与grep一样

      \<(\b):词首

      \>(\b):词尾

7.4.分组:

    ():

     向后引用: \1,\2,\3:

Eg3:  a |b:a or b

    C|cat  :  C 或 cat

   (C|c)at  :Cat或者cat

Eg4:寻找1-255之间的整数

 egrep   --color '\<([1-9][1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>'   file

 

fgrep:不支持正则表达式搜索,查询速度比grep命令快,但是不够灵活:它只能找到固定的文本,而不是规则表达式。