Linux基础知识——grep命令、正则表达式

 

 

1.什么是grep

    grep的全称为(Global search Regular Expression and Printing,全面搜索正则表达式并把行打印出来),grep是linux系统中一种强大的文本搜索工具,它只能使用基本的正则表达式来搜索文本,并把匹配的行打印出来。

 

2.语法与常用选项

语法:# grep [选项-option] ‘pattern’ FILE

选项:--color=auto  高亮匹配字符

           -v 反向选取,只显示不符合模式的行

           -o 只显示被 模式匹配到的字符,而不是整个行

           -A # 显示匹配到的行时,顺带显示其后面的#行

           -B # 显示匹配到的行时,顺带显示其前面的#行

           -C # 显示匹配到的行时,顺带显示其前后的#行

           -i 不区分字符大小写

           -E 使用扩展的正则表达式,grep -E=egrep

 

 

3.基本正则表达式元字符及实例

关于元字符的具体信息可以man 7 regex 查看

为了方便编辑博文,此处根据元字符功能自行做了如下分类

(1)字符匹配类

.:匹配任意单个字符

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

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

(2)次数匹配类

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

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

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

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

(3)字符锚定类

^: ^pattern,锚定行首

$: pattern$,锚定行尾

^$:表示空白行

\<:锚定词首

\>:锚定词尾

\<pattern\>:锚定单词

(4)其他类

\(pattern\):表示分组

 

3.1

^: ^pattern,锚定行首,例如

# grep --color=auto '^root' /etc/passwd        /*匹配以root为行首的行,选项--color=auto意为高亮匹配字符*/

image_thumb3

 

# grep -o --color=auto '^root' /etc/passwd        /*上述命令-o选项,至显示字符,不显示整行*/

image

 

 

3.2

$: pattern$,锚定行尾

# grep --color=auto 'sh$' /etc/passwd        /*匹配以sh为行尾的行*/

image_thumb41[1]

 

# grep -v 'sh$' /etc/passwd        /*选项-v,匹配未以sh为行尾的行*/

image

 

3.3

^$:表示空白行

# grep '^$' /etc/rc.d/rc.sysinit | wc �Cl        /*匹配文件内容中的空白行,通过管道显示空白行行数*/

image_thumb51[1]

 

3.4

.:匹配任意单个字符

# grep 'r..t' /etc/passwd        /*匹配文件中包含r开头后接2个任意单个字符和t的行*/

image

 

3.5

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

# grep --color=auto 'a*b' /test/grep.txt        /*匹配符合b前出现任意次a的行*/

image_thumb1

 

3.6

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

# grep --color=auto 'r.*h' /etc/passwd        /*在文件中匹配每行以r开头,以h结尾的内容*/

image_thumb61

 

3.7

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

# grep "r[0-9].*h" /etc/passwd        /*匹配文件passwd中符合r开头,中间为任意长度任意字符,并以h结尾的行*/

image_thumb31[1]

 

3.8

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

# grep "r[^[:digit:]]" /etc/passwd        /*匹配以r开头后接一个除数字外的任意单个字符的行*/

image

 

 

3.9

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

 

首先在/test下新建文件grep.txt,内容如下

image_thumb[4]

 

# grep "a\?b" /test/grep.txt        /*匹配文件内容中符合b前出现0至1次a的行*/

image_thumb41

 

# grep "^a\?b$" /test/grep.txt        /*匹配文件中符合b前出现0至1次a,且行首为a,行尾为b的行*/

image_thumb51

 

3.10

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

\{0,n\}:至多n次

\{m,\}:至少m次

\{m\}:精确匹配m次 

 
# grep --color=auto "a\{1,2\}b" grep.txt        /*匹配文件中字符b前出现至少1次至多2次a的行*/

image_thumb[3]

 

3.11

\<:锚定词首,同\b

 

# grep --color=auto "\<[bB].\{2,5\}[tT]" /etc/rc.d/rc.sysinit        /*匹配文件中词首为b或者B,接2-5个任意字符,接t或者T的行*/
image

从以上信息看出,匹配的内容中词首一定的是b或B,没有其他字母在b前

 

3.12

\>:锚定词尾,同\b

# grep --color=auto "[bB].\{2,5\}[tT]\>" /etc/rc.d/rc.sysinit        /*匹配文件中词首为b或者B,接2-5个任意字符,接t或者T的行*/

image

从以上信息看出,匹配的内容中词尾一定的是t或T,没有其他字母在t后

 

3.13

\<pattern\>:锚定单词,同\bpattern\b

# grep --color=auto "\<[bB].\{2,5\}[tT]\>" /etc/rc.d/rc.sysinit        /*匹配文件中词首为b或者B,接2-5个任意字符,以t或者T为词尾的行*/

image

 

3.14

\(pattern\):表示分组

# grep --color=auto "\(ab\)\{1,3\}" grep.txt        /*匹配文件中ab至少1次至多三次*/

image

 

还有一种用法为引用分组

\(pattern\).*\1        数字1此时表示引用前面的分组内容pattern

以下两个正则表达式并不相同

 

编辑文件grep内容,如下

image

# grep --color=auto "a.b.*a.b" grep.txt        /*后面的a.b不一定与前面的相同*/
# grep --color=auto "\(a.b\).*\1" grep.txt        /*因为引用前面的分组内容,所以一定相同*/

image

 

 

4.egrep扩展正则表达式元字符及实例

 

4.1 什么是egrep

egrep是扩展正则表达式命令,等同于grep -E,利用此命令可以使用扩展的正则表达式对文本进行搜索,并把符合用户需求的字符串打印出来。

 

4.2 语法格式

语法:# egrep [选项-option] ‘pattern’ FILE

4.3元字符

为了方便编辑博文,此处根据元字符功能自行做了如下分类

 

(1)字符匹配类

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

(2)次数匹配类

*:匹配紧挨在其前面的字符任意次
+: 匹配其前面的字符至少1次
?: 匹配紧挨在其前面的字符0次或1次 (基本正则表达式中为\?)
{m,n}: 至少m次,至多n次(基本正则表达式中为\{m,n\}) 

(3)字符锚定类
\<:锚定词首
\>:锚定词尾
^ :锚定行首
$ :锚定行尾

(4)其他类

a|b: 表示a或者b,二选一;

():分组,支持引用\1, \2;

 

4.4 实例

字符匹配类、字符锚定类、次数匹配类的用法和与基本正则表达式的用法相同,不再重复阐述,以下列出有变化及其他元字符用法实例。

 

 

(1) 分组:()与或者:|,基本正则表达式中分组为\(pattern\)

要求匹配文件内容以大写S或小写s开头的行

# egrep "^(s|S)" /proc/meminfo        /*正确的写法,此时需要做分组处理*/

image

# egrep "^s|S" /proc/meminfo        /*错误的写法,表示匹配文件内容中以小写s开头或包含大写S的行*/

image

 

另有 要求匹配文件中cat 和 Cat

正确写法 egrep “(c|C)at” test.txt

错误写法 egrep “c|Cat” test.txt    意为匹配c或Cat

 

(2) 匹配字符前面的字符至少1次:+

# egrep --color=auto "a+b" /test/grep.txt        /*匹配文件中b前至少出现1次a的行*/

image

 

 

5.fgrep

 

fgrep命令等同于grep -F,它利用固定的字符串来对文本进行搜索,但不支持正则表达式的引用,所以此命令的执行速度也最快。

 

语法:fgrep [选项-option] pattern FILE

 

 

6.补充一点

模式中使用了变量,并需要正确使用变量内容就需要使用双引号

# UserName=root        /*定义变量*/

# grep "^$UserName" /etc/passwd        /*需用双引号,表示引用变量的值root,使用单引号则bash认为此处使用字符本身*/

错误写法 # grep '^$UserName' /etc/passwd

image

 

关于grep的学习,先记录到这里,在以后的学习工作中有新知识再补充。

你可能感兴趣的:(linux,search,表达式,基础知识)