greplinux中比较常用的字符处理命令,主要用来搜索要查找的字符所在的行。

grep主要包含:grepegrepfgrep,这里我们主要总结一下egrep的简单用法

单纯解析命令比较枯燥,我们结合这样一个文本来作练习,文件名为regular_express.txt,文本内容如下:

"Open Source" is a good mechanismto develop programs!

apple is my favorite food!

Football game is not use feet only!

this dress doesn't fit me!

However, this dress is about $ 3183dollars.

GNU is free air not free beer.

Her hair is very beauty.

I can't finish the test.

Oh! The soup taste good.

motorcycle is cheap than car!

This window is clear!

the symbol '*' is represented as start!

Oh!My god!

The gd software is a library for draftingprograms.

You are the best is mean you are the no. 1!

The world <Happy> is the same with"glad"!

I like dog!

google is the best tools for searchkeyword!

goooooogle yes!

go! go! Let's go!

# I am VBird

为了方便区别,我们将grep匹配到的字符红色高亮显示:

[root@instructor ~]# alias grep="grep--color=auto"

1.假设我们要查找以小写字母开头的行

[root@instructor ~]# grep"^[a-z]" regular_express.txt

这里“^”表示,以后面字符开头,“[a-z]”表示匹配从a-z26个小写字母中的任意一个字符,“^[a-z]”结合起来就表示匹配任意小写字母开头行,输出结果如下:

wKioL1NeF8jiq63RAADotIpPDjA647.jpg

同理,如果要查找以任意大写字母开头的行可以使用“^[A-Z]”来表示

2. 查找以大写字母开头的行

[root@instructor ~]# grep "^[A-Z]"regular_express.txt

输出结果如下:

[root@instructor ~]# grep '^[A-Z]'regular_express.txt

wKioL1NeF9bCr4aDAAE6rQFtf_U990.jpg

3.选取包含“the”字符串的行,并列出行号

[root@instructor ~]# grep -n 'the'regular_express.txt

wKiom1NeGBTxCH8jAAEA3XOVAHM610.jpg

这里的“-n”是选项中的一种,表示列出行号。还有很多选择可以帮助我们选取所需要的行,例如,刚才我们查找了包含“the”的行,现在我们要查找不包含“the”的行怎么办?

4.利用选项反向选取,查找不包含“the”的行

[root@instructor ~]# grep -nv 'the'regular_express.txt

wKioL1NeF_2zuGrjAAG5Ehrd1Ng929.jpg

这里的“-v”选项就表示反向选取,选取不匹配字符串的行。

5.如果想要选取以“the”开头且不管大小写的行,则可以加上选项“-i

[root@instructor ~]# grep -in '^the'regular_express.txt

wKiom1NeGFiBH1h1AAC7Ci8jwT0698.jpg

6.查找以“.”结尾的行

查找以某字符串开头的行可以使用“^”,查找以某字符结尾的行可以使用“$”,但是这里“.”有特殊含义,我们需要使用“\”将其特殊含义取消,即“\.$

[root@instructor ~]# grep -n '\.$'regular_express.txt

wKioL1NeGDyw67lIAAHRrwUPsng771.jpg

7.查找包含数字的行

[root@instructor ~]# grep -n '[0-9]'regular_express.txt

wKiom1NeGHOSq-auAACXQ8SzQVc054.jpg

[0-9]表示只要匹配0-9中任一数字即可

通过上面例子,可以总结一下grep简单的用法:

首先我们了解一下grep的语法:#grep [option] 'pattern' filename

Option:

-a:将二进制文件以textwe文件的方式查找数据

-c:计算找到‘查找字符串’的次数

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

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

-i:不区分字符大小写

-A:后面可加数字,after的意思,表示除了列出匹配的那一行,后面的n行也列出来

-B:后面可加数字,before的意思,表示除了列出匹配的那一行,前面的n行也列出来

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

--color=auto:表示将查找到的字符串高亮显示

Pattern:这里就是我们需要查找的字符串

在搜索要查找的字符串时,我们可以借用很多特殊的符号来帮助我们简化工作:

[:alnum:]:代表英文大小写字符及数字,即a-zA-Z0-9

[:alpha:]:代表任何英文大小写字符,,即a-zA-Z

[:blank:]:代表空格键与[TAB]按键

[:space:]:代表空白行

[:digit:]:代表数字,即0-9

[:lower:]:代表小写字符,即a-z

[:upper:]:代表大写字符,即A-Z

[:punct:]:代表标点符号,即“‘?!:;#$

例:查找任意以小写字母开头的行

[root@instructor ~]# grep -n '^[[:lower:]]'regular_express.txt

wKiom1NeGICyXb__AADyxarzMyE163.jpg

输出结果等同于:

[root@instructor ~]# grep"^[a-z]" regular_express.txt

例:查找任意以大写字母开头的行

[root@instructor ~]# grep -n '^[[:upper:]]'regular_express.txt

输出结果等同于:

[root@instructor ~]# grep "^[A-Z]"regular_express.txt


再来看一下基本正则表达式:

^word:查找以‘word’开头的行

word$:查找以‘word’结尾的行

.:代表一定有一个任意字符

*:代表重复前面的字符零次到无穷多次

a*b:ab,aab,acb,b

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

\:将特殊符号的特殊意义取消

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

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

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

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

\{0,n\}:0-n次

\{m,\}:至少m次

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

如:a\{1,3\}b:

练习:1.显示/proc/meminfo文件中以s或S开头的行,即不区分大小写

[root@instructor ~]# grep -n '^[sS]' /proc/meminfo

或者

[root@instructor ~]# grep -in '^s' /proc/meminfo

两者显示结果一致

wKioL1NeGGawF18rAAFXLo2TbgY311.jpg

2.显示/etc/passwd中以nologin结尾的

[root@instructor ~]# grep 'nologin$'/etc/passwd

wKiom1NeGJ6xTPmSAAGZM0LRO8Y987.jpg

内容较多,不逐一显示。

3、显示/etc/rc.d/rc.sysinit中以#开头,且后面跟一个或多个空白字符,而后又跟了任意非空白字符的行

[root@instructor ~]# grep'^#[[:space:]]\{1,\}[^[:space:]]' /etc/rc.d/rc.sysinit

wKiom1NeGKfjvHMnAAFwr1I6F4o735.jpg

4、显示/etc/rc.d/rc.sysinit中符合形为“任意单个字符n任意字符任意单个字符n”模式的行;即任意单个字符后面跟了个n,n后面有任意长度的任意字符,而后是任意单个字符后面跟了个n

[root@instructor ~]# grep '.n.*.n' /etc/rc.d/rc.sysinit

结果比较多,就不截图显示了