Linux Notepad:如何用Grep进行文本搜索
小樊
33
2025-11-15 07:41:29
Linux 环境下用 Grep 进行文本搜索
适用说明与准备
- grep 是 Linux 下的命令行文本搜索工具,支持正则表达式,可快速在文件或目录中查找匹配内容。若你使用的是 Linux 版 Notepad(如 gedit、nano 等),其内置搜索功能相对有限,复杂检索建议直接在终端使用 grep;若你指的是 Windows 上的 Notepad++,可用其 Ctrl+Shift+F 进行图形化搜索。为便于练习,先准备一个示例文件:echo “Hello Linux\nError: failed to start\nwarning: low disk\nHello again” > notepad.txt。
基本语法与常用选项
- 语法:grep [选项] ‘模式’ [文件…]。常用选项:
- -i:忽略大小写
- -v:反向匹配(显示不包含模式的行)
- -r/-R:递归搜索子目录
- -n:显示匹配行号
- -l:仅显示包含匹配的文件名
- -c:统计匹配行数
- -o:仅输出匹配到的部分
- -w:整词匹配
- -A N / -B N / -C N:显示匹配行后/前/前后各 N 行上下文
- -e PATTERN:指定多个模式
- -f FILE:从文件读取模式(每行一个)
- –color/–colour:高亮匹配内容(多数发行版默认开启)
常用场景与示例
- 在单个文件中查找:grep “hello” notepad.txt
- 忽略大小写:grep -i “hello” notepad.txt
- 显示行号与上下文:grep -n -C 1 “error” notepad.txt
- 递归目录搜索:grep -r “hello” ./mydir/
- 仅列出包含匹配的文件名:grep -rl “hello” ./mydir/
- 统计匹配行数:grep -c “hello” notepad.txt
- 只输出匹配片段:grep -o “ERROR: .*” notepad.txt
- 整词匹配:grep -w “hello” notepad.txt
- 多关键字(OR):grep -E “error|fail|warn” notepad.txt
- 从文件读取多个模式:grep -f patterns.txt notepad.txt
- 管道组合检索进程:ps aux | grep “nginx”
- 结合 find 在指定类型文件中搜索:find /var/log -type f -name “*.log” | xargs grep “error”
正则表达式速查
- 行首/行尾:^hello(行首)、error$(行尾)
- 字符类与范围:[vV]ivek(大小写 Vivek)、[0-9](数字)、[[:upper:]](大写字母)
- 量词:使用扩展正则 -E 更直观,如 v{2}(两个 v)、co{1,2}l(co 后 1–2 个 o)、c{3,}(至少 3 个 c)
- 或逻辑:grep -E ‘linux|unix’ file;等价写法 grep ‘linux|unix’ file
- 分组与捕获:egrep ‘w(es)t.*\1’ file(匹配 west…es 且重复)
- 空白行与点号转义:grep ‘^$’ file(空行);匹配 IP 需转义点号:grep ‘192.168.1.254’ file;或用字符类:egrep ‘[[:digit:]]{1,3}.[[:digit:]]{1,3}.[[:digit:]]{1,3}.[[:digit:]]{1,3}’ file
- 单词边界:使用 -w 或 \b 精确匹配单词边界(如 grep -w ‘foo’ 不匹配 foobar 中的 foo)
实用技巧与排错
- 处理以连字符开头的模式:grep -e ‘–test–’ file(避免被当作选项解析)
- 搜索包含空格或特殊字符的模式:用引号包裹,如 grep “error message” file
- 递归并排除目录:grep -r --exclude-dir={node_modules,.git} “pattern” .
- 只显示匹配文件名并统计数量:grep -rl “pattern” . | wc -l
- 压缩日志检索:使用 zgrep 直接搜索 .gz 文件,如 zgrep “error” app.log.gz
- 高亮与可读性:grep –color=auto “pattern” file;在管道中可用 less -R 保留颜色
- 区分基本正则与扩展正则:基本正则需转义 {n,m},扩展正则用 -E 后直接写 {n,m}
- 权限与路径:对系统目录搜索可能需 sudo;路径中含空格请用引号包裹