- grep的用途:
显示匹配一个或多个模式的文本行。grep命令在一个或多个文件中查找某个字符模式。如果这个模式中包含空格,就必须用引号把它括起来。grep命令中,模式可以是一个被引号引起了的字符串,也可以是单个词,位于文件后的所有单词都会被认为是文件名。grep将输出发送到屏幕,他不会对输入文件做任何修改和变化。 时常会作为管道的第一步,以便对匹配的数据作进一步处理。
- grep家族
grep
最早的文本匹配程序,所使用POSIX定义的基本正则表达式(Basic Regular Expression, BRE)
egrep
扩展式grep这个程序使用的是扩展的正则表达式(Extended Regular Expression, ERE)——这是一套功能更强大的正则表达式,
使用它的代价就是会消耗更多的运行资源。在早期出现的PDP-11的机器上,这点事关重大,不过以现在的系统而言,在性能影响上几乎没有太大的差别。
fgrep
快速grep(fast grep)。这个版本匹配固定字符串而非正则表达式,它使用游湖的算法,能更有效的匹配固定字符串。也就是说
,grep和egrep智能匹配单个正则表达式,儿fgrep使用不同的算法,却能匹配过个字符串,有效地测试每个输入行里,是否有匹配的查找字符串。
- grep 的语法:
grep [options ...] pattern-spac [files ...] grep word fliename1 filename2 ...
- grep使用的正则表达式元字符
元字符 |
功能 |
示例 |
匹配对象 |
---|---|---|---|
^ |
行首定位符 |
‘^simaopig%’ |
匹配所有以simaopig开头的行 |
$ |
行尾定位符 |
‘simaopig$’ |
匹配所有以simaopig结尾的行 |
. |
匹配任意一个字符 |
‘s.m’ |
匹配包含一个s字符,后面跟一个字符(随意),再跟一个m的行 |
* |
匹配0或多个前一字符 |
‘s*m’ |
匹配包含零个或多个s字符,后面跟有一个m字符的行 |
[] |
匹配一组字符中的任意一个 |
‘[Ss]imaopig’ |
匹配simaopig,或者Simaopig |
[^] |
匹配不在指定字符组内的字符 |
‘[^a-z]imaopig’ |
匹配不包含在a-z之间的字符后跟着imaopig的行,即所有aimaopig-zimaopig的行都不包含(有点绕) |
\< |
词首定位符 |
‘\ |
匹配以simaopig为开头的词的行,simaopigabcd也是可以的 |
\> |
词尾定位符 |
‘simaopig\>’ |
匹配以simaopig为结尾的词的行,abcdsimaopig也是可以的 |
\(..\) |
标记匹配的字符 |
‘\(simaopig\)'s blog’ |
标记寄存器里的一段字符,该寄存器被记作1号寄存器。以后引用这段字符时,可以使用\1来重复该模式。9个标签中最左边的是第一号。例如,模式simaopig被保存在1号寄存器里,之后用\1来引用它。 |
x\{m\}或x\{m,\}或x\{m,n\} |
字符x的重复出现 |
‘s\{5\}’,'s\{5,\}’,'s\{5,10\}’ |
匹配连续出现5个s、至少5个s或5到10个s的行 |
- grep使用的正则表达式元字符例子
cat test_grep.txt
abc def hic lmn abc
123 456 1.23 4.5 321
ABC Def hIc lmN ABC
A BC Def hIc lmN ABC
You are a good boy
you are a good girl
you are not a good girl
That's a very lovely dog
例一:
grep ABC test_grep.txt #ABC Def hIc lmN ABC grep 'ABC' test_grep.txt #ABC Def hIc lmN ABC grep "ABC" test_grep.txt #ABC Def hIc lmN ABC
当匹配模式为单个单词时既可以加单引号或双引号,也可以不加。
例二:
grep A BC test_grep.txt #注意:A和BC之间有空格
当匹配模式之间有空格时,将会报错:
grep: BC: 没有那个文件或目录
test_grep.txt:ABC Def hIc lmN ABC
test_grep.txt:A BC Def hIc lmN ABC
此时grep会认为要查找的文件时BC 和test_grep.txt
例三:
grep ^Y test_grep.txt #You are a good boy grep ‘^Y’ test_grep.txt #You are a good boy
虽然第一个shell并没有错,但是当匹配模式为正则表达式,最好加上引号。
例四:
grep '1\...' test_grep.txt #123 456 1.23 4.5 321
打印含有数字1后面一个点再后面是两个任意字符的行,此处的第一个点做了转义
例五:
grep '^[Aa]' test_grep.txt #abc def hic lmn abc #ABC Def hIc lmN ABC #A BC Def hIc lmN ABC
打印以大写的A或小写的a开头的行。
例六:
grep '[^0-9]' test_grep.txt #abc def hic lmn abc #123 456 1.23 4.5 321 #ABC Def hIc lmN ABC #A BC Def hIc lmN ABC #You are a good boy #you are a good girl #you are not a good girl #That's a very lovely dog
打印含有非数字的行,由于第二行含有小数点,所以也当作非数字打印了。
grep '^[^0-9]' test_grep.txt #abc def hic lmn abc #ABC Def hIc lmN ABC #A BC Def hIc lmN ABC #You are a good boy #you are a good girl #you are not a good girl #That's a very lovely dog
打印以非数字开头的行。
例七:
类似与例六,可以打印一个目录下的所有文件(不含目录),或一个目录下的所有目录(不含文件)
ll | grep '^d' #只打印一个目录下所有的目录 grep '[^0-9]' test_grep.txt #只打印一个目录下所有的文件 ll | grep -v '^d' #与上面的第二个命令相同,也是只打印一个目录下所有的文件,-v是反向查找, #只打印不匹配的行。后面将会介绍。
例八:
grep '^A *' test_grep.txt #ABC Def hIc lmN ABC #A BC Def hIc lmN ABC
注:在grep支持的正则表达是里面没有‘+’,‘?’,如果一定要匹配含有个数可以用‘{’, '}'。例如上面要匹配以A开头后面至少含有一个空格的行,可以用下面的方式。
grep '^A \{1,\}' test_grep.txt #A BC Def hIc lmN ABC
例九:
cat test_grep.txt
abc def hic lmn abc
123 456 1.23 4.5 321
ABC Def hIc lmN ABC
ABC Def hIc lmN dsf
A BC Def hIc lmN ABC
You are a good boy
you are a good girl
you are not a good girl
That's a very lovely dog
grep '^[A-Z]\{3\}' test_grep.txt #ABC Def hIc lmN ABC #ABC Def hIc lmN dsf grep '^([A-Z]\{3\}).*1$' test_grep.txt #ABC Def hIc lmN ABC
注意第二个的后向引用,打印 以3个大写字母开头,中间可以有任意多个任意字符,但必须以开头的3个字母结尾 的行
例十:
grep '\<you' test_grep.txt #you are a good girl #you are not a good girl grep '\<good\>' test_grep.txt #You are a good boy #you are a good girl #you are not a good girl grep '\<good girl\>' test_grep.txt #you are not a good girl
"\<"是词首定位符,"\>"是词尾定位符。第一个打印词首含有“you”的行,第二个打印含有单词“good”的行,第三个打印含有单词“good girl”的行,这里把“good girl”当做了一个词