1. 命令介绍
当我们需要在文件中搜索特定文本时,grep 命令就派上了用场。它是全局正则表达式打印 (global regular expression print)的缩写,用于在文件中查找匹配指定模式的行,并将匹配到的行输出到标准输出。
2. 基本用法
grep [options] pattern [file...]
pattern:要搜索的模式,可以是普通字符串或正则表达式。
file:要搜索的文件名。如果未提供文件名,则从标准输入读取输入。
参数
-r, --recursive:递归地搜索目录中的文件。
-n, --line-number:显示匹配行的行号。
-i, --ignore-case:忽略大小写。
-f FILE, --file=FILE:从文件或文件列表(以空格分隔)中读取模式,并用于搜索。
-v, --invert-match:显示不匹配模式的行。
-l, --files-with-matches:仅显示包含匹配模式的文件名,而不显示匹配的行。
-c, --count:仅显示匹配的行数,而不是匹配的行本身。
-w, --word-regexp:只匹配整个单词,而不是部分匹配。
-o, --only-matching:仅显示匹配的部分文本,而不是整行文本。
-E, --extended-regexp:使用扩展正则表达式进行匹配。
-F, --fixed-strings:按照字符串字面意义匹配,而不是正则表达式。
-A NUM, --after-context=NUM:显示匹配行以及后面的 NUM 行。
-B NUM, --before-context=NUM:显示匹配行以及前面的 NUM 行。
-C NUM, --context=NUM:显示匹配行以及前后各 NUM 行。
--exclude=GLOB:排除符合指定通配符模式的文件,GLOB
是一个通配符模式。
--exclude-dir=DIR:排除符合指定目录名的目录。
--include=GLOB:只搜索符合指定通配符模式的文件。
-x, --line-regexp:匹配整行,而不是匹配行中的任意部分。
-m NUM, --max-count=NUM:仅显示 NUM 行匹配结果,然后停止搜索。
--color=WHEN:对匹配的文本着色显示。WHEN 可以是 never
, always
, 或 auto
。
--binary-files=TYPE:处理二进制文件。TYPE 可以是 binary
, text
, 或 without-match
。
示例
1. 在文件中搜索包含 "error" 的行:
grep "error" file.txt
2. 在多个文件中递归搜索包含 "pattern" 的行,并显示行号:
grep -nr "pattern" directory/
3. 搜索时忽略大小写:
grep -i "pattern" file.txt
4. 显示不匹配模式的行:
grep -v "pattern" file.txt
5. 显示匹配的行数而不是匹配的行:
grep -c "pattern" file.txt
6. 仅显示包含匹配模式的文件名,而不显示匹配的行:
grep -l "pattern" *.txt
7. 匹配以特定字符串结尾的行:使用 $
匹配行的结尾。
grep 'end$' file.txt
8. 使用扩展正则表达式进行匹配:
grep -E "pattern1|pattern2" file.txt
9. 显示匹配行以及后面的 NUM 行:
grep -A 3 "pattern" file.txt
10. 搜索一个目录下的所有文件,但不想搜索以 .log
结尾的文件:
grep -r --exclude='*.log' "text" /path/to/directory
11. 获取前两个匹配结果:
grep -m 2 "pattern" file.txt
3. 实际应用
分析日志
例如我需要在CentOS中查看最近的30个登录失败的IP
运行下面的命令结合tail命令从/var/log/secure日志文件中过滤出"Failed password for invalid user"的行:
grep "Failed password for invalid user" /var/log/secure | tail -n 30
再结合awk命令统计最近30个登录失败的IP及其次数:
grep "Failed password for invalid user" /var/log/secure | tail -n 30 | awk '{print $13}' | sort | uniq -c | sort -nr
命令解释
这个命令是一个复杂的管道命令,用于分析 /var/log/secure
文件中最近 30 条包含 "Failed password for invalid user" 的日志条目,并统计出及其出现次数:
-
grep "Failed password for invalid user" /var/log/secure
:首先使用 grep 命令在/var/log/secure
文件中查找包含字符串 "Failed password for invalid user" 的行。 -
tail -n 30
:然后使用 tail 命令只保留最近的 30 行匹配到的日志条目。 -
awk '{print $13}'
:接着使用 awk 命令提取每行中的第 13 列,这一列通常包含登录尝试的IP。 -
sort
:对提取出来的IP进行排序,以便后续的 uniq 命令能够正确统计出现次数。 -
uniq -c
:使用 uniq 命令统计每个IP出现的次数,并添加一个前缀表示出现次数。 -
sort -nr
:最后,对统计结果按照出现次数进行逆序排序,以便显示出现次数最多的IP在最前面。
查找文本
例如,我需要查看网站配置在哪个nginx配置文件中(配置文件名跟域名不相关的情况下),可以使用grep命令结合-nr参数查找整个nginx目录:
grep -nr domain.com /etc/nginx