Ubuntu小技巧13--grep命令详解

Posted 昕光xg

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Ubuntu小技巧13--grep命令详解相关的知识,希望对你有一定的参考价值。


Ubuntu小技巧13--grep命令详解

 

grep家族由grep、egrep和fgrep命令组成。grep命令全局搜索文件中的正则表达式并打印满足表达式的所有行。egrep和fgrep命令只是grep的变体。egrep命令是一个扩展的grep,支持更多的正则表达式元字符。fgrep命令被称为固定的grep,有时也称为快速grep,它将所有字符视为文字;也就是说,正则表达式元字符本身并不是特殊的——它们本身是匹配的。自由软件基金会提供了一个免费的grep版本,称为GNU grep。这些grep版本是Linux系统上使用的版本,可以在Sun Solaris操作系统是的 /usr/xpg4/bin 中找到。GNU版本的grep扩展了基本的正则表达式元字符集,增加了POSIX遵从性,并包含了许多新的命令行选项。它们提供了一个名为rgrep的递归grep,该命令可以递归访问目录树。

grep命令搜索文件或多个文件中的字符模式,如果该模式包含空格,则必须用引号括起来。模式要么是一个带引号的字符串,要么是一个单词,模式后面的所有其他单词都被视为文件名。Grep将输出发送到屏幕,并且不会以任何方式改变或影响输入文件。

 

1、grep使用说明

使用格式: grep [OPTIONS] PATTERN [FILE...]

grep在FLE中搜索匹配的行,若FILE为空则从标准输入中读取数据。

示例1:grep Tom /etc/passwd
说明:在passwd中搜索包含Tom的行,若存在则输出该行,若不存在则无任何输出。

示例2:ps -ef | grep root
说明:将ps的输出通过管道的方式给grep,并输出所有宝行root的行。

 

2、正则表达式通配符

此处当前只列出标准grep常用的选项,后续将补充egrep、fgrep等特有选项。

 

Metacharacter

Function

Example

What It Matches

^

起始文本

^love

匹配所有以love开头的行

$

结束文本

love$

匹配所有以love结束的行

.

匹配一个字符

l..e

匹配包含一个 l, 接着两个字符, 最后一个 e 的行

*

匹配零或者多个之前的字符

*love

匹配零或多个空格, 后面接着字符串love(注:*前有一个空格)

[ ]

匹配一个字符在字符集中

[Ll]ove

匹配包含 love 或者 Love的行

[^]

匹配一个字符不在字符集中

[^A–K]ove

匹配行:其中一个字符不在A-K间,接着字符串ove

\\<

起始单词

\\<love

匹配以love单词开头的行,即某个单词开头包含love

\\>

结束单词

love\\>

匹配以love单词结束的行,即某个单词结尾包含love

\\(..\\)

标记匹配的字符,将其作为整体处理

(love\\)ing

标记在寄存器中的部分标记,稍后记为1号。为了以后引用,可以使用\\1来重复这个模式。可以使用最多9个标记,从模式最左边的第一个标记开始。即将love保存在寄存器1中,稍后可用\\1代表love,具体参考示例13。

x\\m\\

 

x\\m,\\ 

 

x\\m,n\\

重复字符x:m次;

重复字符x:至少m次;

重复字符x:m-n次;

o\\5\\

 

o\\5,\\

 

o\\5,10\\

匹配重复o 5次的行

 

匹配重复o 至少5次的行

 

匹配重复o 5-10次的行

本文使用测试数据如下:

northwest NW Charles Main 3.0 .98 3 34 
western WE Sharon Gray 5.3 .97 5 23
southwest SW Lewis Dalsass 2.7 .8 2 18
southern SO Suan Chin 5.1 .95 4 15
southeast SE Patricia Hemenway 4.0 .7 4 17
eastern EA TB Savage 4.4 .84 5 20
northeast NE AM Main Jr. 5.1 .94 3 13
north NO Margot Weber 4.5 .89 5 9
central CT Ann Stephens 5.7 .94 5 13

示例3:grep NW datafile
结果:northwest NW Charles Main 3.0 .98 3 34 
说明:匹配宝行NW的行

示例4:grep NW d*
datafile:northwest NW Charles Main 3.0 .98 3 34 
df.txt:northwest NW Tony Main 3.0 .98 3 134
说明:d*即为匹配以d开头的所有文件

示例5:grep ^n datafile
northwest NW Charles Main 3.0 .98 3 34 
northeast NE AM Main Jr. 5.1 .94 3 13 
north NO Margot Weber 4.5 .89 5 9 
说明:匹配以n开始的行

示例6:grep  3$ datafile
说明:匹配以3结尾的行,不知道为啥没输出,可能版本不匹配的原因

示例7:grep 5\\.. datafile
western WE Sharon Gray 5.3 .97 5 23
southern SO Suan Chin 5.1 .95 4 15
northeast NE AM Main Jr. 5.1 .94 3 13 
central CT Ann Stephens 5.7 .94 5 13
说明:匹配包含5.x的行,其中x为任意单字符

示例8:grep \\.5 datafile
north NO Margot Weber 4.5 .89 5 9 
说明:匹配包含.5的行

示例9:grep ^[we] datafile
western WE Sharon Gray 5.3 .97 5 23
eastern EA TB Savage 4.4 .84 5 20
说明:匹配包含数字吗w或e的行

示例10:grep [A-Z][A-Z] A datafile
northeast NE AM Main Jr. 5.1 .94 3 13 
central CT Ann Stephens 5.7 .94 5 13
说明:匹配包含2个字母一个空格一个A的行

示例11:grep er* datafile
eastern EA TB Savage 4.4 .84 5 20 
north NO Margot Weber 4.5 .89 5 9 
说明:匹配包含1个e紧接着至少0个r的行

示例12:grep [a-z]\\9\\ datafile
northwest NW Charles Main 3.0 .98 3 34 
southwest SW Lewis Dalsass 2.7 .8 2 18
southeast SE Patricia Hemenway 4.0 .7 4 17
northeast NE AM Main Jr. 5.1 .94 3 13 
说明:匹配包含9个连续小写字母的行

示例13:grep \\(3\\)\\.[0-9].*\\1 *\\1 datafile
grep \\(3\\)\\.[0-9].*\\1 *\\1 datafile
northwest NW Charles Main 3.0 .98 3 34 
说明:匹配包含 [3][.][任意0-9数字][任意长度任意字符][3][空格][3]的行,其中\\(3\\)表明匹配一个3且3被标记为1,后续使用个\\3即可代表3,\\.表示.,[0-9]表示任意0-9的一个数字,.*表示任意长度任意字符,\\1表示3, 表示空格(\\1 与\\1之间有一个空格),\\1表示3

示例14:grep \\<north datafile
northwest NW Charles Main 3.0 .98 3 34 
northeast NE AM Main Jr. 5.1 .94 3 13 
north NO Margot Weber 4.5 .89 5 9 
说明:匹配起始包含north单词的行

示例15:grep \\<north\\> datafile
north NO Margot Weber 4.5 .89 5 9 
说明:匹配以north开始和结束单词的行

 

3、常用选项

 

-b

在每行前面加上它被找到的块号,这在根据上下文定位磁盘块号时有时很有用

–c

显示被匹配到的行数,而不是显示参与匹配的文件行数

–h

不显示文件名称

–i

忽略大小写

–l

只列出具有匹配行(一次)的文件名,用换行符分隔

–n

在每个行之前加上它在文件中的相对行号

–s

静默工作模式,也就是说,当有错误的时候只显示错误消息,这对于检查退出状态很有用,无错误的时候正常显示

–v

反转搜索,只显示不匹配的行(v为小写,大写则输出版本号)

–w

以单词的形式搜索表达式,这只适用于grep。(不是所有版本的grep都支持这个特性;例如,SCO UNIX就没有)

示例16:grep -nv th datafile
2:western WE Sharon Gray 5.3 .97 5 23
6:eastern EA TB Savage 4.4 .84 5 20 
9:central CT Ann Stephens 5.7 .94 5 13
结果:输出不包含th的行

示例17:grep north  datafile nofile.txt #目录下无nofile.txt
datafile:northwest NW Charles Main 3.0 .98 3 34 
datafile:northeast NE AM Main Jr. 5.1 .94 3 13 
datafile:north NO Margot Weber 4.5 .89 5 9 
grep: nofile.txt: No such file or directory
$ grep  -s north  datafile nofile.txt
datafile:northwest NW Charles Main 3.0 .98 3 34 
datafile:northeast NE AM Main Jr. 5.1 .94 3 13 
datafile:north NO Margot Weber 4.5 .89 5 9
说明:无-s的时候会输出错误,有-s的时候能匹配错误输出

示例18:grep  -w north datafile
north NO Margot Weber 4.5 .89 5 9
说明:只以单词为匹配单位,若没有-w则northwest也可以匹配到

选项说明就这么多吧,其它的一看便懂没什么值得说的!

 

4、实用案例及注意事项

4.1、实用案例

1)grep -n ^$ testfile.txt 

说明:找出空白行(笔者测试没起作用,可能是版本支持的原因)

2grep -n e.*20 datafile 
6:eastern EA TB Savage 4.4 .84 5 20

说明:找出e开头20结尾的行

4.2、注意事项

1)默认grep只遍历当前目录文件,若添加-r的话就可以递归遍历整个目录。

2)任意一个字节 . 与重复字节 *
这两个符号在正则表达式的意义如下:
. (小数点):代表『一定有一个任意字节』的意思;
* (星号):代表『重复前一个字符, 0 到无穷多次』的意思,为组合形态

4.3、其它补充功能

 

5、说明

测试系统版本:Ubuntu 16.04.4 SERVER LTS (64-bit), 安装在VM虚拟机上

参考文献: UNIX® Shells by Example Fourth Edition  By Ellie Quigley

​Linux之grep及正则表达式​

 

今天就写到这里了,后续会根据实际使用情况继更4.1-4.2,4.3中重要的补充功能也会慢慢完善起来!

 


以上是关于Ubuntu小技巧13--grep命令详解的主要内容,如果未能解决你的问题,请参考以下文章

Ubuntu小技巧16--常见命令使用方法

Ubuntu使用之Svn命令小技巧

命令提示符(cmd)中的tracert命令详解(小技巧)

ubuntu小技巧8——linux(ubuntu)下mysql安装问题

ubuntu小技巧24--快速入门ffmpeg

Ubuntu Desktop20.04使用小技巧