Skip to main content

Linux 核心命令

文件查看编辑命令 grep

grep 是 Linux 中最常用的文本搜索工具之一,名字来源于 "global regular expression print",就是在文件中找你要的内容,然后把包含这些内容的行显示出来。

1. 基本语法

grep [选项] "搜索内容" 文件名

最简单的用法就是这样:

grep "hello" file.txt

这会在 file.txt 文件中搜索包含 "hello" 的所有行。

2. 基本搜索操作

  • 在单个文件中搜索
# 在文件中搜索特定文本
grep "error" log.txt

# 搜索多个文件
grep "error" log1.txt log2.txt log3.txt

# 使用通配符搜索多个文件
grep "error" *.txt
grep "error" /var/log/*.log
  • 显示行号

-n 选项可以显示匹配行的行号:

grep -n "error" log.txt
  • 忽略大小写

-i 选项忽略大小写:

grep -i "ERROR" log.txt
# 这样 error、Error、ERROR 都能匹配到
  • 显示不匹配的行

-v 选项显示不包含搜索内容的行:

grep -v "debug" log.txt
# 显示所有不包含 "debug" 的行

3. 递归搜索

  • 在目录中递归搜索

-r-R 选项在整个目录树中搜索:

# 在当前目录及其子目录中搜索
grep -r "TODO" .

# 在指定目录中递归搜索
grep -r "function" /home/user/code/

# 只搜索特定类型的文件
grep -r --include="*.py" "def " /home/user/code/
  • 排除特定文件或目录
# 排除特定文件类型
grep -r --exclude="*.log" "error" .

# 排除特定目录
grep -r --exclude-dir="node_modules" "import" .

# 排除多个目录
grep -r --exclude-dir={node_modules,build,dist} "import" .

4. 控制输出格式

  • 只显示匹配的文件名
# 只显示包含匹配内容的文件名
grep -l "error" *.txt

# 显示不包含匹配内容的文件名
grep -L "error" *.txt
  • 统计匹配数量
# 统计匹配行的数量
grep -c "error" log.txt

# 统计匹配的文件数量
grep -l "error" *.txt | wc -l
  • 显示上下文
# 显示匹配行的前后各3行
grep -C 3 "error" log.txt

# 只显示匹配行的前3行
grep -B 3 "error" log.txt

# 只显示匹配行的后3行
grep -A 3 "error" log.txt

5. 正则表达式基础

  • 基本正则表达式
# 匹配行首
grep "^error" log.txt

# 匹配行尾
grep "error$" log.txt

# 匹配任意字符
grep "er.or" log.txt
# 能匹配 error、eraor、er1or 等

# 匹配任意数量的字符
grep "er.*or" log.txt
  • 字符类
# 匹配数字
grep "[0-9]" log.txt
grep "[[:digit:]]" log.txt

# 匹配字母
grep "[a-zA-Z]" log.txt
grep "[[:alpha:]]" log.txt

# 匹配数字或字母
grep "[[:alnum:]]" log.txt

# 匹配空白字符
grep "[[:space:]]" log.txt
  • 重复匹配
# 使用扩展正则表达式 (-E 选项)
grep -E "colou?r" text.txt
# 匹配 color 或 colour

grep -E "go{2,4}" text.txt
# 匹配 goo、gooo、goooo

grep -E "(ab)+" text.txt
# 匹配 ab、abab、ababab 等

6. 扩展正则表达式 (-E 选项)

使用 -E 选项可以使用扩展正则表达式,功能更强大:

# 或操作
grep -E "error|warning" log.txt
# 匹配包含 error 或 warning 的行

# 分组
grep -E "(http|https)://[a-zA-Z0-9.-]+" log.txt
# 匹配 URL

# 匹配数字范围
grep -E "^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$" log.txt
# 简单的IP地址匹配

# 单词边界
grep -E "\bword\b" text.txt
# 只匹配完整的单词 "word"

7. 固定字符串搜索 (-F 选项)

当你要搜索的内容包含特殊字符时,用 -F 选项按字面意思搜索:

# 搜索包含特殊字符的内容
grep -F "*.txt" log.txt
grep -F "$HOME" log.txt
grep -F "[error]" log.txt

8. 多模式搜索

  • 使用文件指定搜索模式

把要搜索的内容写在文件里,然后用 -f 选项:

# 创建模式文件
echo -e "error\nwarning\nfatal" > patterns.txt

# 使用模式文件搜索
grep -f patterns.txt log.txt
  • 同时搜索多个模式
# 使用扩展正则表达式
grep -E "error|warning|fatal" log.txt

# 分别搜索每个模式
grep -e "error" -e "warning" -e "fatal" log.txt

9. 高亮显示匹配结果

# 高亮显示匹配的部分
grep --color=always "error" log.txt

# 设置环境变量让 grep 总是高亮显示
export GREP_OPTIONS='--color=always'

10. 处理二进制文件

# 把二进制文件当作文本文件处理
grep -a "text" binary_file

# 跳过二进制文件
grep -I "text" *

11. 限制输出

# 只显示前10个匹配结果
grep "error" log.txt | head -10

# 匹配到第一个结果就停止
grep -m 1 "error" log.txt

# 静默模式,不显示输出,只返回状态码
grep -q "error" log.txt

12. 退出状态码

grep 命令的退出状态码很有用:

# 0: 找到匹配
# 1: 没找到匹配
# 2: 发生错误

# 在脚本中使用
if grep -q "error" log.txt; then
    echo "发现错误"
else
    echo "没有错误"
fi

13. 特殊字符的处理

当搜索内容包含特殊字符时:

# 使用单引号避免shell解释
grep '*.txt' file.txt

# 使用反斜杠转义
grep "\$HOME" file.txt

# 使用 -F 选项按字面意思搜索
grep -F '$HOME' file.txt