grep:根据模式搜索文本,并将符合模式的文本行打印出来
-i:忽略大小写
-v:搜索不符合模式的文本行
-o:打印完全匹配的字符
--color:匹配的字符高亮
-A NUM:打印匹配的文本行以及文本的后NUM行
-B NUM:打印匹配的文本行以及文本的前NUM行
-CNUM:打印匹配的文本行以及文本的前后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])\>'