grep:根据模式搜索文本,并将符合模式的文本行打印出来

    -i:忽略大小写

    -v:搜索不符合模式的文本行

    -o:打印完全匹配的字符

    --color:匹配的字符高亮

    -A NUM:打印匹配的文本行以及文本的后NUM行

    -B NUM:打印匹配的文本行以及文本的前NUM行

    -C NUM:打印匹配的文本行以及文本的前后NUM行

pattern:由文本字符和正则表达式的元字符组合而成


回顾下文件名匹配规则:

*:匹配任意长度的任意字符

?:匹配任意单个字符

[]:指定某个范围内的单个长度字符

[^]:指定某个范围外的单个长度字符

字符集合:

    [:space:]:空字符

    [:digit:]:数字

    [:lower:]:小写字母

    [:upper:]:大写字母

    [:alpha:]:大小写字母

    [:alnum:]:大小写字母以及数字集合


正则表达式:REGular EXPression

    基本正则表达式:Basic

    扩展正则表达式:Extended 命令:egrep,可以使用+,|等元字符

元字符:

.:匹配任意单个字符

[]:范围内的单个字符

[^]:范围外的单个字符

字符集合:

    [:space:]:与文件名匹配规则一样还有[:digit:]....等等


匹配次数(贪婪模式:就是尽可能最大化匹配,比如asabkslbss,我们使用a.*b模式时,它会匹配asabkslb,而不是asab)

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

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

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

\{m,n\}:至少匹配m次,至多匹配n次


为什么使用\转义{的原因:

    linux自带花括号展开(比如ls -l /etc/{passwd,shadow}等价于 ls -l /etc/passwd /etc/shadow),如果不加转义的会误解   


位置锚定:

^:以其后面字符为行首的行

$:以其前面字符为行尾的行

    ^$:空白行

\<或\b:以其后面字符为词首的行

\>或\b:以其前面字符为词尾的行


分组:

    \(\)

     后向引用

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

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

    \3: ....


REGEXP中词的概念:词与词之间以特殊字符作为分隔符其他字符视为词的一部分比如sadjk&jj23342^&这个可以视为两个词 sadjk和jj23342


普通正则表达式示例:

    假设文本行中包含:a,b,ab,aab,acb,adb,amnb(每个单词为一行,否则失去意义),请问a*b,a\?b,a.*b,分别匹配哪些文本行


答案:a*b匹配b,ab,aab,但是因为grep是部分匹配所以除了a,其他文本行都会显示出来,用grep --color可以看到匹配到的字符

    a\?b:匹配b和ab,一样由于部分匹配的原因,除了a,其他的也会显示

    a.*b:匹配ab,aab,acb,adb,amnb。

[root@logstach tmp]# cat test.txt 

a

b

ab

aab

acb

adb

amnb

[root@logstach tmp]# grep a*b test.txt

[root@logstach tmp]# grep 'a*b' test.txt

b

ab

aab

acb

adb

amnb

[root@logstach tmp]# grep 'a?b' test.txt

[root@logstach tmp]# grep 'a\?b' test.txt

b

ab

aab

acb

adb

amnb

[root@logstach tmp]# grep 'a.*b' test.txt

ab

aab

acb

adb

amnb


词首词尾锚定示例:

[root@logstach tmp]# cat test.txt 

he is a sb

he is a  bigsb

sb250 is him

250sb also is  him

[root@logstach tmp]# grep  'sb\>'  test.txt 

he is a sb

he is a  bigsb

250sb also is  him

[root@logstach tmp]# grep  '\<sb'  test.txt 

he is a sb

sb250 is him

[root@logstach tmp]# grep  '\<sb\>'  test.txt 

he is a sb


sb\>锚定以sb作为词尾的单词,所以匹配sb、bigsb、250sb,同样地\<sb锚定以sb作为词首的单词

\<sb\>完全锚定sb。


分组后向引用示例:

[root@logstach tmp]# cat test.txt 

He  love his lover.

She like her lover.

He like his liker

she  love  her liker.

假设我们要在上述文本行中找到类似于love ...lover 这种前后对应的行,而不要love...liker这样额行,我们可以这样做:

[root@logstach tmp]# grep  '\(l..e\).*\1' test.txt 

He  love his lover.

He like his liker

解析:l..e匹配like和love,括号括起来表示这里作为一个分组,.*表示中间跟任意一个字符,\1表示引用第一个分组。


扩展正则表达式:

字符匹配:

.

[]

[^]

字符集:


次数匹配:

*:

?:

+:匹配其前面的字符至少一次   (相当于{1,})

{m,n}:m值不能为空    (基本正则也一样)


位置锚定:

^

$

\<

\>


分组:

():

\1 ,\2 ,\3...


或者

|:or

示例:

    C|cat:表示匹配C或者cat,而不是Cat或者cat

[root@logstach tmp]# cat test.txt 

cat

Cat

C

China

Cat123

[root@logstach tmp]# egrep 'C|cat' test.txt 

cat

Cat

C

China

Cat123

[root@logstach tmp]# egrep '\<C|cat\>' test.txt 

cat

Cat

C

China

Cat123

[root@logstach tmp]# egrep --color '\<(C|cat)\>' test.txt 

cat

C

注意:这里要想完全匹配C|cat,则必须使用分组(),否则\<C|cat\>会被认为以C为词首或者以cat为词尾的单词,我们把China变成小写china,则会被过滤:

[root@logstach tmp]# cat test.txt 

cat

Cat

C

china

Cat123

[root@logstach tmp]# egrep --color '\<C|cat\>' test.txt 

cat

Cat

C

Cat123


问题:用egrep过滤出ifconfig显示的所有可用ip

提示:

    IPv4:

        A:1-127

        B:128-191

        C:192-223

答案:(不唯一)

ifconfig |egrep --color '\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-1][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])\>'