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\)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 '\ 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 '\' 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及正则表达式 :https://www.cnblogs.com/Jeffding/p/7230487.html

 

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

 

你可能感兴趣的:(Linux基础操作及使用技巧,grep命令,shell,正则表达式)