grep - 搜索和过滤文本

grep 在文件或标准输入中搜索与模式匹配的行。

常用参数

  • -i--ignore-case:忽略大小写。
  • -c--count:只输出匹配行数量。
  • -l--files-with-matches:只输出包含匹配内容的文件名。
  • -n--line-number:显示行号。
  • -h--no-filename:搜索多个文件时不显示文件名。
  • -s--no-messages:不显示无法读取文件等错误信息。
  • -v--invert-match:输出不匹配的行。
  • -w--word-regexp:匹配完整单词。
  • -x--line-regexp:匹配整行。
  • -r--recursive:递归搜索目录。
  • -q--quiet:不输出内容,只通过退出状态表示是否匹配。
  • -o--only-matching:只输出匹配到的部分。
  • -F--fixed-strings:把模式视为普通字符串。
  • -E--extended-regexp:使用扩展正则表达式。
  • -f FILE--file=FILE:从文件逐行读取搜索模式。
  • -A N:额外显示匹配行之后 N 行。
  • -B N:额外显示匹配行之前 N 行。
  • -C N:额外显示匹配行前后各 N 行。

使用示例

# 搜索并显示行号
grep -n 'error' application.log
 
# 忽略大小写
grep -i 'warning' application.log
 
# 输出不包含小写字母的行
grep -v '[a-z]' filename
 
# 匹配多个条件
grep -E 'error|warning' application.log
 
# 按普通字符串匹配,避免特殊字符被解释为正则表达式
grep -F 'a.b[c]' filename
 
# 递归搜索 Markdown 文件
grep -rn --include='*.md' 'keyword' notes/

显示上下文

# 显示匹配行前后各一行
grep -C 1 'Error' application.log
 
# 显示匹配行之后两行
grep -A 2 'Error' application.log

从文件读取多个模式

patterns.txt 每行放一个搜索模式:

error
warning
timeout
grep -f patterns.txt application.log

这表示使用文件中的全部模式进行搜索,不是比较两个文件的交集。

在脚本中判断是否匹配

if grep -qF 'ready' status.txt; then
  printf '%s\n' '已就绪'
fi

参考资料