Linux grep使用详解
概述
grep 是Linux/Unix下,对于一组输入文本进行搜索与匹配的一个实用工具。grep 从输入文本中搜索并匹配给定的文本或者模式,这些文本可以是固定内容的文本,也可以用正则表达式去进行搜索匹配,grep 的功能在很多场景下都非常强大,本文将记录一些比较常用的功能。
选项与参数(符号‘,’ 分割的选项效果等同)
- -A num, –after-context=num 打印出匹配结果之后的num行文本.
- -B num, –before-context=num 打印出匹配结果之前的num行文本.
- -C num, –context=num 打印出匹配结果之前与之后的num行,等同于同时使用-A num与-B num.
- -a, –text= 将所有文件视为ASCII文本对待.
part 1 example:
假定有一个hello.c文件,实现的是最简单的打印hello world功能,想在该文件中查找某个固定内容文本,可以这样用:
cat hello.c | grep -a ‘hello world’ #通过管道将cat的执行结果传递给grep,并查找hello world字符串
cat hello.c | grep -A 10 -a ‘hello world’ #查找hello world并打印其后10行内容
cat hello.c | grep -C 10 -a ‘hello world’ #查找hello world并打印其前后各10行内容
- -c, –count 输出搜索到 ‘搜索字符串’ 的行数.
- -n, –line-number 每行搜索结果之前显示结果所在文件中的行号.
- -f file, –file=file 在指定文件中搜索文本或模式.
- -v, –invert-match 搜索不包含搜索文本或模式的行.
- -i, –ignore-case 忽略大小写区别.
part 2 example:
cat hello.c | grep -n -A 10 -a ‘hello world’ #在part 1例子的基础上,结果显示将多显示一个行号
cat hello.c | grep -n -v -a ‘hello world’ #结果将显示不包含hello world的行及行号
- -e pattern, –regexp=pattern 搜索符合pattern的字符串.
正则表达式规则
- ^ #界定行的开始,如 ‘^grep’ 意为匹配以grep开始的行
- 美元符号(markdown抽风,不能打这个。。) #界定行的结束,如 ’ grep$ ’ 意为匹配以grep结尾的行
- . #匹配一个非换行字符,如 ‘gr.p’ 意为匹配gr后接任意一个非换行字符,其后是p的行
- 星号 #匹配零个或多个先前字符 如:’*grep’匹配所有一个或多个空格后紧跟grep的行
- .* #同时用代表任意字符
- [] #匹配一个指定范围内的字符,如 ‘[Gg]rep’ 意为匹配Grep或者grep
- [^] #匹配不在一个指定范围内的字符,如 ‘[ ^a-zA-Z ]’ 意为匹配不含英文字母的字符
- \w #匹配英文字母及数字字符,等同于’[ a-zA-Z0-9 ]’,如 ‘G\w*p’ 意为G后接零个或多个英文字母或数字字符
- \W #匹配非英文字母及数字字符,等同于’[ ^a-zA-Z0-9 ]’
- \b #单词锁定符,如 ‘\bgrep\b’ 只匹配grep
POSIX字符
POSIX增加的特殊字符类,如 [:alnum:] 等同于a-zA-Z0-9,[[:alnum:]]等同于[a-zA-Z0-9],[:alnum:]一定要放入[]之间才有效。
- [:alnum:] #英文字符及数字字符
- [:alpha:] #英文字符
- [:digit:] #数字字符
- [: graph :] #非空字符(非空格、控制字符)
- [:cntrl:] #控制字符
- [:punct:] #标点符号
- [:space:] #所有空白字符
- [:upper:] #大写英文字符
- [:lower:] #小写英文字符
- [:xdigit:] #十六进制数字
part 3 example:
cat hello.c | grep -n -e ^hello #查找hello.c中以hello开始的行
PS:
更多的使用方法还需要进一步在实践中慢慢摸索,grep对于平时的各种搜索都能轻松实现。