Linux grep 命令

grep 命令简介

grep 是一个最初用于 Unix 操作系统的命令行工具。在给出文件列表或标准输入后, grep 会对匹配一个或多个正则表达式的文本进行搜索, 并只输出匹配(或者不匹配)的行或文本。

grep 可根据提供的匹配模式列表, 查询文件中的匹配行. 发现匹配行后, 行内容会被标准输出 (默认), 如果使用了其它参数, 可以产生其它格式的输出

grep 用于匹配文本, 它对输入行的长度没有限制, 除非受限于可用内存大小, 并且可以匹配行内任意字符

使用方法

grep -[acinv] '搜索内容串' filename

常用参数选项

选项 含义
-c 计算找到的符合行的次数
-i 忽略大小写
-n 显示匹配行及行号
-v 找到没有搜索字符串的行
-h 查询多文件时不显示文件名
-l 查询多文件时只输出包含匹配字符的文件名
-s 不显示不存在或无匹配文本的错误信息

实际使用举例

  1. 搜索日志, 查询有多少条 503 错误
grep -c '503' /var/log/httpd/error_log-20141116
  1. 搜索含有 error 字样的行, 并且输出行号
grep -n 'error' /var/log/httpd/error_log-20141116
  1. 搜索没有 error 字样的行, 并且输出行号
grep -nv 'error' /var/log/httpd/error_log-20141116
  1. 搜索寻找安装的软件版本有几个
# centos 下查看安装的 Python 版本
rpm -qa | grep -i python

# Ubuntu 下查看安装的 Python 版本
sudo dpkg -l | grep -i python
  1. 过滤配置文件的注释符号#
#匹配 # 符号的行, 但是输出的是 # 符号以外的行
grep -v '#' /etc/httpd/conf/httpd.conf
  1. 查询每个网卡和IP地址
ifconfig | grep -n inet
  1. 忽略大小写搜索 (-i)
grep -i "ErroR" log.txt
  1. 所有子目录下的搜索 (-r)
 grep -r "exception" log.txt
  1. 精准全匹配搜索 (-w)
grep -w "boo" /path/to/file
  1. 精准全字匹配搜索两个不同单词
grep -w 'word1|word2' /path/to/file
  1. 统计字符串出现的次数 (-c)
grep -c 'word' /path/to/file
#-n的话,  会在结果中, 列出匹配字符串的序列号, 并且会列出内容
grep -n 'word' /path/to/file
  1. 只列出文件名 (-l)
grep -l 'main' *.pls
  1. 高亮显示搜索结果 (–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

原文

https://www.cnblogs.com/nonghu/p/6328595.html

最后更新于 2022-03-15
使用 Hugo 构建
主题 StackJimmy 设计