本文共 5026 字,大约阅读时间需要 16 分钟。
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将输出发送到屏幕,并且不会以任何方式改变或影响输入文件。
使用格式: grep [OPTIONS] PATTERN [FILE...]
grep在FLE中搜索匹配的行,若FILE为空则从标准输入中读取数据。
示例1:grep Tom /etc/passwd
说明:在passwd中搜索包含Tom的行,若存在则输出该行,若不存在则无任何输出。示例2:ps -ef | grep root
说明:将ps的输出通过管道的方式给grep,并输出所有宝行root的行。
此处当前只列出标准grep常用的选项,后续将补充egrep、fgrep等特有选项。
|
本文使用测试数据如下:
northwest NW Charles Main 3.0 .98 3 34 western WE Sharon Gray 5.3 .97 5 23southwest SW Lewis Dalsass 2.7 .8 2 18southern SO Suan Chin 5.1 .95 4 15southeast SE Patricia Hemenway 4.0 .7 4 17eastern 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开始和结束单词的行
|
示例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.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、其它补充功能
测试系统版本:Ubuntu 16.04.4 SERVER LTS (64-bit), 安装在VM虚拟机上
参考文献: UNIX® Shells by Example Fourth Edition By Ellie Quigley
:
今天就写到这里了,后续会根据实际使用情况继更4.1-4.2,4.3中重要的补充功能也会慢慢完善起来!
转载地址:http://kflgi.baihongyu.com/