# grep

Linux 中的 grep 命令用于查找文件里符合条件的字符串,它能使用正则表达式搜索文本,并把匹配的行打印出来。

grep 可用于 Shell 脚本,因为 grep 通过返回一个状态值来说明搜索的状态,如果模板搜索成功,则返回 0,如果搜索不成功,则返回 1,如果搜索的文件不存在,则返回 2。我们利用这些返回值就可进行一些自动化的文本处理工作。

# 格式

grep [option] pattern file

# 常用参数

# 显示不包含匹配文本的所有行
-v 或 --invert-match

# 当指定要查找的是目录而非文件时,必须使用这项参数,否则 grep 指令将回报信息并停止动作
-d <动作> 或 --directories=<动作>
# 以递归的方式查找符合条件的文件,此参数的效果和指定 "-d recurse" 参数相同
-r 或 --recursive

# 计算符合样式的列数
-c 或 --count

# 在行首显示行号
-n

# 忽略字符大小写的差别
-i 或 --ignore-case

# 指定规则文件,其内容含有一个或多个规则样式,让 grep 查找符合规则条件的文件内容,格式为每行一个规则样式
-f<规则文件> 或 --file=<规则文件>

# 只显示全字符合的列
-w 或 --word-regexp

# 只显示全列符合的列
-x --line-regexp

# 规则表达式

和常用正则表达式的使用区别不大,但需要注意在指定个数什么的时候需要使用反斜杠。

符号 说明
\< 锚定单词的开始,如: \<grep' 匹配包含以 grep 开头的单词的行
\> 锚定单词的结束,如 grep\> 匹配包含以 grep 结尾的单词的行
x\{m\} 重复字符 x,m 次,如:0\{5\} 匹配包含 5 个 0 的行
x\{m,\} 重复字符 x,至少 m 次,如:o\{5,\} 匹配至少有 5 个 o 的行
x\{m,n\} 重复字符 x,至少 m 次,不多于 n 次,如:o\{5,10\} 匹配 5-10 个 o 的行

# 案列

在当前目录中,查找文件名以“file”结尾且其内容中包含“test”字符串的文件,并打印出该字符串的行:

grep test *file

从文件中读取关键词进行搜索:

$ cat file
a
b
c

$ cat rule.txt
a
b

grep -f rule.txt file
a
b

搜索包含 2 个以上 “a” 的行:

$ cat test.txt
a
aaa
aa

$ grep 'a\{2\}' test.txt
aaa
aa

# 其它

直接搜索以 “-” 符号开头的匹配模式时,grep 命令会试图把其当作自己的选项参数来解析,此时使用借助 -e 选项:

grep -e '-a' test.txt