一、文本查找工具grep

grep 根据指定模式搜索文档并将符合文档的字符串行显示出来。

正则表达式(regular expression)简写为 regex :是由元字符组合的式子,可当做pattern(模式) 使用,以匹配符合指定特征的字符串。

正则表达式分为基本正则表达式,用字母b表示 和扩展正则表达式,用字母e表示(可以查看帮助手册 man 7 regex

1.元字符:

    <1>  ^pattern  :行首锚定符,查找的字符串在行首

 例如grep  ^root  /etc/passwd

root:x:0:0:root:/root:/bin/bash

<2>  pattern $  :行尾锚定符

<3>  \<pattern  :词首锚定符

<4> parttern\>  :词尾锚定符

<5>  .          : 匹配任意单个字符(除了换行符)

<6>  *          :匹配此前的字符0到任意次(出现的次数)

<7>  .*          :匹配任意长度的任意字符,

<8>           :匹配此前的字符0次或者1

<9>  \{m,n\}     :匹配此前字符最少m次,最多n

   例如:\{5\}    :精确匹配5

         \{5,\}    :匹配最多5

<10> [ ]          :匹配指定范围内的任意单个字符

<11> [^ ]         :匹配之地范围之外的任意单个字符

<12> [:space:] /[:alpha:]/[:lower:]…….    :匹配空格、字母、小写字母等字符

<13> \(\)         :引用此前出现的字符,也可以用来分组

2.grep 命令选项

      -v    对查找的内容取反

      -i    忽略大小写

      -r    递归搜索指定的路径

      -B #  将对应信息之前的# 行也显示出来

      -A #  将对应信息之后的# 行也显示出来

      -C #  将对因信息之前和之后的# 行都显示出来

      -o    只显示被模式匹配到的字符串本身,而非字符串所在的行

      -E    是扩展正则表达式

这里要声明一下扩展正则表达式的某些用法与基本正则表达式的用法是有区别的:

基本正则表达式:            扩展正则表达式:

\{m,n\} 相当于 {m,n}

   \( \ )    相当于 ( )

                  a|b  表示或者的意思

                  +   表示一次匹配1次或者任意次

3.管道的使用: 用“ | 表示

     管道的用法就是:把前一个命令的输出当做后一个命令的输入

     例如ls  -l  /etc   |  more

一个关于正则表达式和管道用法的使用范例:

    1。查找如下字符串中形如xxx.xxx.xxx.xxx.的字符串,其中X必须是数字

abc.111.222.333.

12a.333.444.567

11.222.333.444

111.2.333.333

444.444.222.111

33.325.566.6

123.321.123.333

1.2.3.4

12.3.4.5

其中上面这些内容保存在a 文件中

<1>grep --color=auto "[0-9]\{3\}\.[0-9]\{3\}\.[0-9]\{3\}\.[0-9]\{3\}" a       444.444.222.111

或者grep --color=auto "\([0-9]\{3\}\.\)\{3\}[0-9]\{3\}" a

444.444.222.111

<2>grep --color=auto -E "([0-9]{3}\.){3}[0-9]{3}" a

444.444.222.111

<3>grep --color=auto -E "([0-9]{1,3}\.){3}[0-9]{1,3}" a

11.222.333.444

111.2.333.333

444.444.222.111

33.325.566.6

<4>grep --color=auto -E "(([0-9]|[0-9]{2}|[0-9]{3})\.){3}([0-9]|[0-9]{2}|[0-9]{3})" a

123.321.123.333

1.2.3.4

12.3.4.5

2.查看当前系统上名字为user1的用户的账号的相关信息。

 grep --color=auto "^user1\>" /etc/passwd

3.查找当前系统上以其为附加组的用户超过两个的组的相关信息()

 grep --color=auto "[^:]^:[^:]^:[^:]^:[[:alnum:]]\{1,\},.*" /etc/group

4.查找当前系统上其用户账号密码最常使用期限为99999天的用户账户的相关信息

grep --color=auto "[^:]*:[^:]*:[^:]*:[^:]*:99999:" /etc/shadow

5.分析/etc/inittab文件中如下两行的文本特征,请写出可以精确找到类似两行的模式,而且要让数字前后必须一致

比如此两行中的1或者5

l1:1:wait:/etc/rc.d/rc 1

l5:1:wait:/etc/rc.d/rc 5

grep "l\([15]\):\1:wait:/etc/rc.d/rc[[:space:]]\{1,\}\1" 文件名

6.使用gerp命令来查看文档中的IP信息:

(1)查找不包含0或者255IP地址

\<([1-9]|[1-9][0-9]|1[0-9]{2}|2[01][0-9]|22[0-3])(\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-4])){2}(\.([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-4]))\>

(2)查找包括0或者255IP地址

\<([1-9]|[1-9][0-9]|1[0-9]{2}|2[01][0-9]|22[0-3])(\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])){3}\>

7.使用grep命令查找网卡的IP地址;

1ifconfig eth0 | grep "inet addr" | cut -d: -f2 | cut -d' ' -f1 | grep -v "172.0.0.1"

172.16.24.1

(2)ifconfig | grep "inet addr" | cut -d: -f2 | cut -d' ' -f1 | grep -v "172.0.0.1"

172.16.24.1

172.0.0.1