Last Updated: 2023-07-03 09:50:03 Monday
-- TOC --
本文尝试总结grep
,egrep
,fgrep
和rgrep
命令的用法。一般都使用grep命令,其它几个的存在,只是为了向后兼容。
熟练使用grep,阅读代码必备!
例如,显示所有 python3 进程:
$ ps -ef | grep python3
grep命令的基本格式为:
$ grep [OPTION...] PATTERNS [FILE...]
$ grep PATTERNS [OPTION...] [FILE...]
常用参数:
-n
,显示行号
-F
,--fixed-strings
,相当于fgrep
,完全不支持正则表达式中的任何符号,完全按照搜索条件字面含义进行查找,Interpret PATTERNS as fixed strings, not regular expressions
-i
,比较时忽略大小写,--ignore-case
-v
,--invert-match
,显示没有匹配的行
-o
,--only-match
,只显示match的部分,而不是一整行(用grep实现字符串trim功能)
-c
,只显示匹配的总行数,count。
-q
,安静模式,没有输出,通过$?
获得是否存在匹配的结果,0表示存在匹配成功行。
-An
,显示匹配行及后面n行,After
-Bn
,显示匹配行及前面n行,Before
-Cn
,-A和-B的结合
-l
,得到匹配的文件列表,list
-L
,排除匹配的文件的列表
-w
,让grep匹配一个完整的word
,或者用跟在vim中搜索词一样的写法:
$ grep '\<bin\>' [options] <pathname>
$ grep -w 'bin' ...
-E
,扩展正则表达式,相当于egrep
默认情况下,grep只能够支持基本正则表达式(BRE),只承认^
、$
、.
、[
、]
、*
这些是元字符,所有其他的字符都被识别为普通字符。
扩展正则表达式(ERE),则是在BRE的基础上增加了(
、)
、{
、}
、?
和+
、|
等元字符,因此可以支持更复杂的搜索条件!使用扩展正则表达式搜索,需要用egrep
命令,或者grep -E
。
特别说明:只有在用反斜杠进行转义的情况下,字符(
、)
、{
和}
才会在扩展正则表达式(ERE)中被当作元字符处理,而在基本正则表达式(BRE)中,任何元字符前面加上反斜杠都会使其被当作普通字符来处理。
示例:
$ cat test.c | grep -E '\(\)'
__attribute__ ((indirect_branch("thunk"))) void f(){
int main(){
f();
$ cat test.c | grep -E '\{|\}'
__attribute__ ((indirect_branch("thunk"))) void f(){
}
int main(){
}
-r
,--recursive
,可以进入子目录查找匹配,相当于rgrep
--include=GLOB
,只搜索符合GLOB条件的文件
--exclude=GLOB
,排除符合GLOB条件的文件
一个错误:
$ grep -r abcd *.c
grep: *.c: No such file or directory
这条命令试图搜索从当前路径开始的所有的.c文件,但是grep提示错误!
修正这个错误有两个方法:
$ find . -name *.c | xargs grep abcd
$ grep -r abcd --inlucde=*.c
使用find命令,通过xargs命令给grep传递命令行参数,或者使用grep自带的--include
,表示只搜索某些符合条件的文件。grep命令还有--exclude
参数,表示排除符合条件的文件。
本文链接:https://cs.pynote.net/sf/linux/shell/202111151/
-- EOF --
-- MORE --