grep
Linux grep 命令作为文本处理三剑客的一员(另外两个是 sed 和 awk),常用于查询一个或多个文件中符合条件的字符串。
基本语法示例:
grep [选项] 模式 文件名
grep 命令常用的参数说明:
参数 | 等效参数 | 说明 |
---|---|---|
-a | --text | 不忽略二进制数据 |
-A <显示行数> |
--after-context=<显示行数> | 除了显示符合条件的行之外,并显示该行之后 N 行的内容 |
-b | --byte-offset | 在显示符合条件的行之前,该行中匹配的第一个字符在全文中的位置 |
-B <显示行数> |
--before-context=<显示行数> | 除了显示符合条件的行之外,并显示该行之前 N 行的内容 |
-c |
--count | 统计符合匹配条件的个数 |
-C <显示行数> |
--context=<显示行数> 或 -<显示行数> | 除了显示符合条件的行之外,并显示该行之前或之后 N 行的内容 |
-d <动作> | --directories=<动作> | 当指定要查找的是目录而非文件时,必须使用该参数 |
-e <范本样式> | --regexp=<范本样式> | 指定字符串做为查找条件 |
-E <范本样式> |
--extended-regexp=<范本样式> | 查找条件支持使用正则表达式 |
-f <规则文件> |
--file=<规则文件> | 指定规则文件,用于匹配多个样式,规则文件每行一个规则样式 |
-F | --fixed-regexp | 将样式视为固定字符串的列表 |
-G | --basic-regexp | 将样式视为普通的表示法来使用 |
-h |
--no-filename | 在显示符合样式的那一行之前,不标识该行所属的文件名称 |
-H |
--with-filename | 在显示符合样式的那一行之前,标识该行所属的文件名称 |
-i |
--ignore-case | 忽略字符大小写 |
-l |
--file-with-matches | 列出文件内容符合指定的样式的文件名称 |
-L |
--files-without-match | 列出文件内容不符合指定的样式的文件名称 |
-n |
--line-number | 在显示符合样式的那一行所在的行号 |
-o |
--only-matching | 只显示满足匹配条件的部分内容 |
-P |
--perl-regexp | 查找条件支持使用 Perl 正则表达式,-E 加强版 |
-q | --quiet 或 --silent | 不显示任何信息 |
-r |
--recursive | 此参数的效果和指定 "-d recurse" 参数相同 |
-s | --no-messages | 不显示错误信息 |
-v |
--invert-match | 显示不包含匹配文本的所有行 |
-V | --version | 显示版本信息 |
-w | --word-regexp | 只显示全字符合的列 |
-x | --line-regexp | 只显示全列符合的列 |
-y | / | 此参数的效果和指定 "-i" 参数相同 |
grep 命令常用的正则表达式说明:
正则符号 | 说明 | 示例 | 示例说明 |
---|---|---|---|
^ | 匹配开头 | ^grep | 匹配以 grep 开头 |
$ | 匹配结尾 | grep$ | 匹配以 grep 结尾 |
. | 匹配一个非换行符的字符 | gr.p | 匹配 gr + 任意字符 + p 格式的内容 |
* | 匹配零个或多个先前字符 | *grep | 匹配所有一个或多个空格后紧跟 grep 的行 |
.* | 匹配任意字符 | grep.* | 匹配包含 grep 的任意字符 |
[] | 匹配限制范围内的字符 | [a-zA-Z0-9] 或 [aA] | 匹配属于数字,字母范围内的字符 |
[^] | 匹配不在限制范围内的字符 | [^a-zA-Z0-9] | 匹配不属于数字,字母范围内的字符 |
\(..\) | 标记匹配字符 | \(grep\) | grep 将被标记为 1 |
x{m\} | 匹配重复字符 x,m 次 | o\{5\} | 匹配包含 5 个 o 的行 |
x\{m,\} | 匹配重复字符 x,至少 m 次 | o\{5,\} | 匹配包含至少 5 个 o 的行 |
x\{m,n\} | 匹配重复字符 x,至少 m 次,不多于 n 次 | o\{5,10\} | 匹配包含 5-10 个 o 的行 |
\d | 匹配数字 | \d+ | 匹配任意数字 |
\w | 匹配文字和数字字符,相当于 [A-Za-z0-9] | / | / |
\W | \w 取反,匹配一个或多个非单词字符,如点,句号等 | / | / |
\b | 单词锁定 | \bgrep\b | 只匹配 grep |
使用示例
- 在文件中搜索关键字的行,支持多个文件:
# 多个文件直接加在后面,使用逗号隔开
grep "POST" access.log anaconda-ks.cfg
如图所示:
多个文件会在开头显示对应的文件名,可以使用
-h
不显示文件名。
-A
,显示匹配行并带上后面多少行:
grep -A 1 "POST" access.log
如图所示:
下一条 GET 请求的日志就是通过 -A 输出的。
-b
,显示匹配的内容在全文中的位置(首位的位置):
-B
,显示匹配行并带上前面多少行(和 -A 相反,类似功能的还有 -C 参数):
grep -B 1 "POST" access.log
如如所示:
-c
,统计匹配出现的次数:
grep -c "POST" access.log
如图所示:
-d
,查找的是目录则必须使用该参数(-r 可以替代):
grep -d recurse "POST" /root/
如图所示:
-d 参数支持三个值:read,recurse,skip。-d recurse 可以直接使用 -r 代替。
-E
,简单的正则表达式:
grep -E "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+" access.log
# 多个条件可以使用 |(或)
grep -E "Android|iPhone" access.log
如图所示:
-f
,匹配多个:
创建一个 demo.txt 内容如下:
[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+
Linux
Windows
执行匹配:
grep -E -f demo.txt access.log
如图所示:
-i
,忽略大小写:
grep -i "iphone" access.log
如图所示:
-l
,列出满足匹配的文件名称(-L 相反)
grep -l -d recurse "POST" /root/
如图所示:
-n
,显示匹配的行号:
grep -n "iPhone" access.log
如图所示:
-o
,只显示匹配的字符:
grep -o -E "iP[a-z]+e" access.log
如图所示:
-P
,使用 Perl 正则表达式,相当于 -E 的加强版:
grep -P "\d{1,4}\.\d{1,4}\.\d{1,4}\.\d{1,4}" access.log
如图所示:
-v
,输出除了关键字之外的所有行:
grep -v "POST" access.log
如图所示:
特殊用法
- 递归查询目录中满足匹配条件的文件,并打印文件名和所处的行数:
grep -r -n "text" /root/
如图所示:
- 指定和排除文件类型:
# 递归限制查询的文件类型
grep -r "POST" /root/ --include *.{log,html}
# 递归排除查询的文件类型
grep -r "POST" /root/ --exclude *.{log,html}
如图所示:
- 和其它命令配合使用:
# 配合 find 使用
find . -name "*.log" | xargs grep -n "POST"
# 配合 echo 使用
echo "Hello World" | grep -b -o "W"
# 配合 cat 使用
cat access.log | grep "iPhone"