grep 命令实例教程

grep 命令实例教程

grep 是 Linux/Unix 最常用的文本搜索工具,作用是在文件/标准输出中匹配指定字符串/正则表达式,并输出匹配行。
全称:Global Regular Expression Print(全局正则表达式打印)。


一、环境与基础语法

1. 基本语法

grep [选项] "匹配内容" 文件名/文件列表
# 或管道用法(接收上游命令输出)
命令 | grep [选项] "匹配内容"

2. 测试文件准备

新建 test.txt 用于所有示例:

cat > test.txt << EOF
hello world
Hello Linux
123 test 456
test grep TEST
apple banana orange
Linux is good
line empty below

# comment line
999 abc 777
EOF

二、最简使用

1. 基础字符串匹配

直接搜索普通字符串,区分大小写

# 搜索包含 test 的行
grep "test" test.txt

输出:

123 test 456
test grep TEST

2. 多文件同时搜索

同时匹配多个文件:

grep "Linux" test.txt a.txt b.txt

3. 管道结合(最常用场景)

从命令输出里过滤内容,日常使用最多

# 查看进程,过滤 ssh
ps aux | grep ssh

# 查看端口,过滤 80
netstat -ntlp | grep 80

# 查看日志,过滤 error
cat /var/log/messages | grep error

三、核心常用参数

参数分:大小写、显示控制、反向匹配、递归搜索、正则、统计、行号、颜色 六大类。

小技巧:grep 参数可合并,如 grep -ni "test" test.txt

(一)大小写相关

1. -i 忽略大小写(ignore-case)

匹配时不区分大小写,高频参数。

grep -i "test" test.txt

会同时匹配 test / TEST / Test

2. 默认:区分大小写

不加 -i 严格匹配大小写。


(二)反向/排除匹配

1. -v 反向匹配(invert-match)

输出不包含目标字符串的所有行,排除过滤神器。

# 输出所有不包含 Linux 的行
grep -v "Linux" test.txt

实战场景:过滤注释行、空行

# 排除 # 开头注释行
grep -v "^#" nginx.conf

# 排除空行
grep -v "^$" test.txt

(三)显示行号 & 上下文行

1. -n 显示行号(line-number)

输出匹配行的行号,排查日志必备。

grep -n "Linux" test.txt
2. -c 只输出匹配行数(count)

不输出内容,只统计有多少行匹配

grep -c "test" test.txt
3. -o 只输出匹配到的内容(only-matching)

只打印真正匹配的字符串,而非整行。

grep -o "test" test.txt
4. -A n 显示匹配行 + 后面 n 行(After)

查看匹配内容下文,日志排查超级常用。

# 匹配 Linux,同时显示后面 2 行
grep -A 2 "Linux" test.txt
5. -B n 显示匹配行 + 前面 n 行(Before)

查看匹配内容上文

grep -B 1 "Linux" test.txt
6. -C n 显示前后各 n 行(Context)

等价于 -A n -B n,上下文一起看。

# 前后各 1 行
grep -C 1 "Linux" test.txt

(四)递归搜索(遍历目录)

-r / -R 递归搜索目录(recursive)

整个目录及子目录下所有文件中搜索。

  • grep -r:跟随软链接
  • grep -R:不跟随软链接(推荐)

语法:

# 在 /etc 目录下递归搜索包含 root 的文件
grep -r "root" /etc/

# 组合 -n 显示行号,-i 忽略大小写
grep -rni "linux" /home/

实战:全局查找配置关键字

grep -rn "listen" /etc/nginx/

(五)匹配整行/整单词(精准匹配)

1. -w 匹配完整单词(word-regexp)

只匹配独立单词,不匹配字符串中的子串。

示例对比:

# 原文件有 test、TEST、greetest
# 普通匹配:会命中包含 test 的所有子串
grep "test" test.txt

# 整单词匹配:只匹配独立单词 test
grep -w "test" test.txt
2. -x 匹配整行(line-regexp)

整行内容必须完全一致才匹配。

# 只匹配整行等于 hello world 的行
grep -x "hello world" test.txt

(六)颜色高亮 & 静默模式

1. --color=auto 高亮匹配内容

绝大多数系统默认别名 grep=grep--color=auto,手动使用:

grep --color=auto "test" test.txt
2. -q 静默模式(quiet)

不输出任何内容,只返回执行状态码,多用于 Shell 脚本判断。

  • 匹配到:返回 0(正常)
  • 未匹配到:返回 1

脚本用法示例:

if grep -q "error" app.log; then
  echo "日志发现错误"
fi
3. -l 只输出匹配的文件名(files-with-matches)

只打印哪些文件包含目标内容,不打印行内容。

# 递归查找,只输出含 Linux 的文件名
grep -rl "Linux" ./
4. -L 只输出不匹配的文件名(files-without-match)

-l 相反,列出不含目标内容的文件。


四、进阶:grep 正则表达式(核心难点)

grep 默认支持 基础正则(BRE),扩展正则需要加参数。

1. 正则模式开关

  • 普通 grep基础正则 BRE? + | () {} 需要转义 \
  • -E / egrep扩展正则 ERE(不用转义,写法简洁,推荐)

    egrep 等价于 grep -E

2. 常用正则元字符 + 实例

(1)^ 行首匹配

匹配以指定字符开头的行:

# 匹配以 # 开头的注释行
grep "^#" test.txt

# 匹配以数字开头的行
grep "^[0-9]" test.txt
(2)$ 行尾匹配

匹配以指定字符结尾的行:

# 匹配以 world 结尾的行
grep "world$" test.txt

# 匹配空行(行首=行尾)
grep "^$" test.txt
(3). 匹配任意单个字符

. 代表任意一个字符(不包含换行):

# 匹配 t 后面跟 1 个字符,再跟 st
grep "t.st" test.txt
(4)[] 字符集合
  • [abc]:匹配 a/b/c 任意一个
  • [0-9]:数字
  • [a-z]:小写字母
  • [A-Z]:大写字母
  • [^0-9]非数字(^ 在中括号内表示取反)
# 匹配包含数字的行
grep "[0-9]" test.txt

# 匹配小写字母
grep "[a-z]" test.txt
(5)* 匹配前一个字符 0 次或多次
# 匹配 te + 任意个 s
grep "tes*" test.txt
(6)? + | () {} 扩展正则(必须加 -E

基础 grep 需要 \? \+ \| 转义,-E 无需转义

  1. ?:前一个字符 0 次或 1 次
  2. +:前一个字符 1 次或多次
  3. | 逻辑
  4. ():分组
  5. {n}:精确匹配 n 次;{n,} 至少 n 次;{n,m} n~m 次

示例:

# -E 启用扩展正则
# 匹配 test 或 Linux
grep -E "test|Linux" test.txt

# 匹配 t 后面连续 2 个 e
grep -E "te{2}" test.txt

# 分组:匹配 hello 或 Hello
grep -E "(H|h)ello" test.txt

3. -F 禁用正则(纯字符串匹配)

-F = fgrep,把匹配内容当作普通字符串,元字符(. * ^ $)失去正则意义。
如果搜索内容包含 . * 等符号,必加 -F,避免正则解析错误。

# 搜索包含 "a.b" 字符串(不是正则)
grep -F "a.b" test.txt

五、高频组合参数(生产常用组合)

整理工作中最实用的组合命令,直接复制即用:

  1. 忽略大小写 + 显示行号

    grep -ni "关键字" file
    
  2. 排除空行 + 排除注释行(配置文件清洗)

    grep -v "^#" file.conf | grep -v "^$"
    
  3. 递归搜索目录 + 行号 + 忽略大小写

    grep -rni "关键字" /目标目录/
    
  4. 查看日志 + 匹配行 + 前后 5 行(查报错上下文)

    grep -C 5 "error" app.log
    
  5. 只统计匹配行数

    grep -c "关键字" file
    
  6. 脚本判断:是否包含关键字(静默模式)

    grep -q "关键字" file && echo "存在" || echo "不存在"
    
  7. 精准匹配完整单词

    grep -w "word" file
    

六、grep 家族三兄弟区别

Linux 里三个同源命令,本质都是 grep,只是正则模式不同:

  1. grep:默认基础正则(BRE),特殊字符需 \ 转义
  2. egrep = grep -E:扩展正则(ERE),不用转义,推荐日常正则使用
  3. fgrep = grep -F:纯字符串匹配,不解析正则,含特殊符号优先用

七、常见坑点总结

  1. 搜索内容含 . * [ ] 等符号:一定要加 -F,否则被当作正则;
  2. 正则 | () + ? 不生效:忘记加 -E
  3. 大小写匹配异常:忘记加 -i
  4. 递归搜索找不到文件:检查目录权限,或确认 -r/-R
  5. 想排除多行内容:多次管道 grep -v 叠加。

八、速查参数表

参数作用
-i忽略大小写
-v反向匹配(排除)
-n显示行号
-c统计匹配行数
-o只输出匹配内容
-A n显示匹配行及后 n 行
-B n显示匹配行及前 n 行
-C n显示前后各 n 行
-r/-R递归搜索目录
-w匹配完整单词
-x匹配整行
-l只输出匹配的文件名
-L只输出不匹配的文件名
-q静默模式(脚本用)
-E启用扩展正则
-F纯字符串匹配(禁用正则)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值