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等特有选项。
|
本文使用测试数据如下:
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、常用选项
|
示例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中重要的补充功能也会慢慢完善起来!