文本查找的需要:
grep,egrep,fgrep
grep:根据模式,搜索文本,并将符合模式的问本行显示出来、
模式(Pattern):文本字符和正则表达式的元字符组合而成的匹配条件
格式:grep [option] PATTERN file...
-i
--color
-v:显示没有被模式匹配到的行
-o:只显示被模式匹配到的串
-E:使用扩展正则表达式 =egrep
-A n:匹配行的after n行
-B n:匹配行的before n行
-C n:匹配行的前后 n行
对比之前学过的globbing:
*,?,[],[^]
man 7 glob
正则表达式:Regular Expression,REGEXP
注意:grep是整行的部分匹配(最长匹配),显示整行
正则表达式分类:
1、Basic REGEXP:基本
2、Extended REGEXP:扩展
元字符:
.表示匹配单个任意字符
[]:匹配指定范围内的任意单个字符
[^]:匹配指定范围外的任意单个字符
字符集合:[:space:][:digit:],[:lower:]...
匹配次数:
*:匹配其前面的字符任意次
a*b
a,b,ab,aab
.*:任意长度的任意字符
?:匹配其前面的字符1次或0次(一般要加一个转译字符\?)
\{m,n\}:匹配其前面的字符至少m次,至多n次
位置锚定:
^:锚定行首,此字符后面的任意内容必须出现在行首
$:锚定行尾,此字符后面的任意内容必须出现在行尾
eg:grep '^a.*a$' test.txtt #以a开头和结尾的行
^$:空白行
\<或\b:其后面的任意字符必须作为单词首部出现
\>或\b:其前面的任意字符必须作为单词的尾部出现
eg:\<root\>:单词必须是root,rootroot也不行
分组:
\(\)
eg:\(ab\)*,ab可以出现任意次
分组还有一个重要的用法是实现后向引用:
\1:引用第一个括号分组
扩展的正则表达式:
字符匹配:
.
[]
[^]
次数匹配:
*
?:不用\
+:匹配其前面的字符至少1次
{m,n}
位置锚定:
^
$
\<
\>
分组:
():分组
\1,\2,\3...
或者
|:表示or
练习:
匹配1-255的数字
egrep '\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-9])\>' test.txt
匹配255.255.255.255这样类型的数字串
egrep '(\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-9])\>\.){3}(\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-9])\>\.)' test.txt
为什么不可以后面引用呢?
fgrep:不支持正则表达式,但是执行速度快
grep,egrep,fgrep
grep:根据模式,搜索文本,并将符合模式的问本行显示出来、
模式(Pattern):文本字符和正则表达式的元字符组合而成的匹配条件
格式:grep [option] PATTERN file...
-i
--color
-v:显示没有被模式匹配到的行
-o:只显示被模式匹配到的串
-E:使用扩展正则表达式 =egrep
-A n:匹配行的after n行
-B n:匹配行的before n行
-C n:匹配行的前后 n行
对比之前学过的globbing:
*,?,[],[^]
man 7 glob
正则表达式:Regular Expression,REGEXP
注意:grep是整行的部分匹配(最长匹配),显示整行
正则表达式分类:
1、Basic REGEXP:基本
2、Extended REGEXP:扩展
元字符:
.表示匹配单个任意字符
[]:匹配指定范围内的任意单个字符
[^]:匹配指定范围外的任意单个字符
字符集合:[:space:][:digit:],[:lower:]...
匹配次数:
*:匹配其前面的字符任意次
a*b
a,b,ab,aab
.*:任意长度的任意字符
?:匹配其前面的字符1次或0次(一般要加一个转译字符\?)
\{m,n\}:匹配其前面的字符至少m次,至多n次
位置锚定:
^:锚定行首,此字符后面的任意内容必须出现在行首
$:锚定行尾,此字符后面的任意内容必须出现在行尾
eg:grep '^a.*a$' test.txtt #以a开头和结尾的行
^$:空白行
\<或\b:其后面的任意字符必须作为单词首部出现
\>或\b:其前面的任意字符必须作为单词的尾部出现
eg:\<root\>:单词必须是root,rootroot也不行
分组:
\(\)
eg:\(ab\)*,ab可以出现任意次
分组还有一个重要的用法是实现后向引用:
\1:引用第一个括号分组
扩展的正则表达式:
字符匹配:
.
[]
[^]
次数匹配:
*
?:不用\
+:匹配其前面的字符至少1次
{m,n}
位置锚定:
^
$
\<
\>
分组:
():分组
\1,\2,\3...
或者
|:表示or
练习:
匹配1-255的数字
egrep '\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-9])\>' test.txt
匹配255.255.255.255这样类型的数字串
egrep '(\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-9])\>\.){3}(\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-9])\>\.)' test.txt
为什么不可以后面引用呢?
fgrep:不支持正则表达式,但是执行速度快