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
今天就写到这里了,后续会根据实际使用情况继更4.1-4.2,4.3中重要的补充功能也会慢慢完善起来!
以上是关于Ubuntu小技巧13--grep命令详解的主要内容,如果未能解决你的问题,请参考以下文章