grep 命令简介
grep 是一个最初用于 Unix 操作系统的命令行工具。在给出文件列表或标准输入后, grep 会对匹配一个或多个正则表达式的文本进行搜索, 并只输出匹配 (或者不匹配) 的行或文本。
grep 可根据提供的匹配模式列表, 查询文件中的匹配行. 发现匹配行后, 行内容会被标准输出 (默认), 如果使用了其它参数, 可以产生其它格式的输出
grep 用于匹配文本, 它对输入行的长度没有限制, 除非受限于可用内存大小, 并且可以匹配行内任意字符
使用方法
grep -[acinv] '搜索内容串' filename
常用参数选项
选项 | 含义 |
---|---|
-c | 计算找到的符合行的次数 |
-i | 忽略大小写 |
-n | 显示匹配行及行号 |
-v | 找到没有搜索字符串的行 |
-h | 查询多文件时不显示文件名 |
-l | 查询多文件时只输出包含匹配字符的文件名 |
-s | 不显示不存在或无匹配文本的错误信息 |
实际使用举例
-
搜索日志, 查询有多少条 503 错误
grep -c '503' /var/log/httpd/error_log-20141116
-
搜索含有 error 字样的行, 并且输出行号
grep -n 'error' /var/log/httpd/error_log-20141116
-
搜索没有 error 字样的行, 并且输出行号
grep -nv 'error' /var/log/httpd/error_log-20141116
-
搜索寻找安装的软件版本有几个
# centos 下查看安装的 Python 版本 rpm -qa | grep -i python # Ubuntu 下查看安装的 Python 版本 sudo dpkg -l | grep -i python
-
过滤配置文件的注释符号#
#匹配 # 符号的行, 但是输出的是 # 符号以外的行 grep -v '#' /etc/httpd/conf/httpd.conf
-
查询每个网卡和IP地址
ifconfig | grep -n inet
-
忽略大小写搜索 (
-i
)grep -i "ErroR" log.txt
-
所有子目录下的搜索 (
-r
)grep -r "exception" log.txt
-
精准全匹配搜索 (
-w
)grep -w "boo" /path/to/file
-
精准全字匹配搜索两个不同单词
grep -w 'word1|word2' /path/to/file
- 统计字符串出现的次数 (
-c
)
grep -c 'word' /path/to/file
# -n 的话, 会在结果中, 列出匹配字符串的序列号, 并且会列出内容
grep -n 'word' /path/to/file
- 只列出文件名 (
-l
)
grep -l 'main' *.pls
- 高亮显示搜索结果 (
-color
)
grep --color apache /etc/passwd
grep 正则表达式元字符集整理
ERE 和 BRE
简称 | 全称 | 解释 |
---|---|---|
BRE | basic regular expressions | 基础正则表达式 (过时的) |
ERE | extended regular expressions | 扩展正则表达式 (现代的) |
如果从字面理解, 基础这个字眼让 BRE 显得具有一定地位, 但实质上 BRE 的存在只是为了兼容一些老旧的软件。
GNU grep
对 BRE 和 ERE 进行了扩展, 使得它们之间的差别很小, 那就是转义字符的使用:
?
+
|
{
}
(
)
\?
\+
\|
\{
\}
\(
\)
BRE 中前者表示字面量, 后者具有特殊含义。而 ERE 则相反, 前者具有特殊含义, 后者表示字面量。例如列出文件名以 config
或者 conf
或者 cfg
结尾的文件
# 使用 ERE
ls -a | grep -E '(config|conf|cfg)$'
# 使用 BRE
ls -a | grep '\(config\|conf\|cfg\)$'
推荐使用 ERE
ERE 的风格被现代应用程序广泛支持, 推荐使用 ERE
grep
默认使用 BRE, grep -E
或者 egrep
使用 ERE
sed
默认使用 BRE, sed -E
使用 ERE
gawk
使用 ERE
egrep
等同于 grep -E
, 下文将统一使用 egrep
grep 适用的正则表达式
符号 | 含义 |
---|---|
^ | 锚定行的开始 如: ^grep 匹配所有以 grep 开头的行 |
$ | 锚定行的结束 如: grep$ 匹配所有以 grep 结尾的行 |
. | 匹配一个非换行符的字符 如: gr.p 匹配 gr 后接一个任意字符, 然后是 p |
* | 匹配零个或多个先前字符 如: *grep 匹配所有一个或多个空格后紧跟 grep 的行 |
[] | 匹配一个指定范围内的字符, 如 [Gg]rep 匹配 Grep 和 grep |
[^] | 匹配一个不在指定范围内的字符, 如: [^A-FH-Z]rep 匹配不包含 A-R 和 T-Z 的一个字母开头, 紧跟 rep 的行 |
.* | 一起用代表任意字符 |
\(..\) | 标记匹配字符, 如 \(love\) , love 被标记为 1 |
\<word | 以某单词开头 (GNU 扩展) |
word\> | 以某单词结尾 (GNU 扩展) |
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 的行 |
\w | 匹配文字和数字字符 |
\b | 匹配单词的开始或结束, 匹配单词边缘。 (GNU 扩展), 如: \bgrep\b 只匹配 grep |
原文