grep命令

Last Updated: 2023-07-03 09:50:03 Monday

-- TOC --

本文尝试总结grepegrepfgreprgrep命令的用法。一般都使用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 --