文本查找的需要

grep,egrep,fgrep(fast)不支持正则表达式

Pattern:模式,文本字符和正则表达式的元字符组合而成的匹配条件。

grep:根据模式,搜索文本,并将符合模式的文本行显示出来。(部分匹配)

grep [options] PATTERN [FILE...]    

   -i: 忽略大小写

   --color[=WHEN]: 设定颜色显示匹配串

      alias grep='grep --color'

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

eg. grep 'root' /etc/passwd

   -o:只显示被模式匹配到的字符串本身(每个串显示为一行)


*: 任意长度的任意字符

?:  任意单个字符

[]: 任意范围内的字符

[^]: 任意范围外的字符


正则表达式:Regular Expression,REGEXP

元字符:

.: 匹配任意单个字符 eg. grep 'r..r' /etc/passwd

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

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

  字符集合:[:digit:],[:lower:],[:upper:],{:punct:],[:space:],[:alpha:],[:alnum:]


字符个数:

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

   a, b, ab, aab, acb, adb, amnb, amnbmnbmnb

   a*b

   a.*b


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


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


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

   \{1,\}

   \{0,3\}

   eg. grep 'a\{1,3\}b' text.txt

   grep 'a.\{1,3\}b' text.txt


位置锚定:

^: 锚定行首,此字符后面的任意内容必须出现在行首

   eg. grep '^r..t' /etc/passwd

$: 锚定行尾,此字符前面的任意内容必须出现在行尾

   eg. grep 'y$' /etc/inittab

^$: 空白行

   eg. grep '^$' /etc/inittab | wc -l

   以数字结尾的行

   eg. grep '[[:digit:]]$' /etc/inittab

\<或者\b: 锚定词首,其后面的任意字符必须作为单词首部出现

\>或者\b: 锚定词尾,其前面的任意字符必须作为单词的尾部出现


   \<root\> 精确匹配root这个单词 <==> \broot\b


分组:

\(\):

      \(ab\)*: ab可以出现0次,1次或任意次

      后向引用

       \1: 引用第一个左括号以及与之对应的右括号所包含的所有内容

       \2:

       \3:


He love his lover.

She like her liker.

He like his lover.

l..er


grep 'l..e.*l..e' test.txt

grep '\(l..e\).*\1' test.txt


练习:

1 查找当前系统上名字为student(必须出现在行首)的用户的账号的相关信息,文件为/etc/passwd

grep '^student\>' /etc/passwd | cut -d: -f3

id -u student


2 分析/etc/inittab文件中如下文本中前两行的特征(每一行中出现的数字必须相同),请写出可以精确找到类似两行的模式:

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

l3:3:wait:/etc/rc.d/rc 3


grep '^l\([0-9]\):\1.*\1$' /etc/inittab


正则表达式:

   Basic REGEXP:基本

   Extended REGEXP:扩展


grep:使用基本正则表达式定义的模式来过滤文本的命令。

   -E: 支持扩展的正则表达式

   -A #(数值):匹配行后面的#行也显示出来

   -B #(数值):匹配行前面的#行也显示出来

   -C #(数值):匹配行前后各#行都显示出来


扩展的正则表达式:

字符匹配:

.

[]

[^]


次数匹配:

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

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

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

{m,n}: 扩展的花括号不需要使用反斜线


位置锚定:

^

$

\<

\>


分组:

(): 不需要加反斜线

\1, \2, \3, ...


或者

|: or

grep -E = egrep


练习:找出ifconfig命令执行结果中的IP地址

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


IPV4:

5类:A B C D E

A:1-127

B:128-191

C: 192-223


\<[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][0-9]|2[0-4][0-9]|25[0-4])\>){2}\.\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-4])\>