跳到主要内容

高效使用命令行进行全文搜索与日志过滤

全文搜索

全文搜索可以分为两种主要方式:基于 findgrep 的组合,以及直接使用 grep 的递归搜索。这两种方式各有优势,适用于不同场景。

使用 findgrep

常见用法

  • 大小写敏感搜索
find . -type f \( -name "*.cpp" -o -name "*.h" -o -name "*.c" \) -exec grep -Hn "\bCurProc\b" {} +
  • 忽略大小写搜索
find . -type f \( -name "*.cpp" -o -name "*.h" -o -name "*.c" \) -exec grep -Hni "\bCurProc\b" {} +

高级技巧

  • 按时间查找:查找最近一天修改过的 .log 文件。
find . -name "*.log" -mtime -1 -type f
  • 按大小查找:查找大于 10MB 的文件。
find . -size +10M -type f
  • 结合 xargs 批量操作:删除所有 .tmp 文件。
find . -name "*.tmp" -type f -print0 | xargs -0 rm -f

提示-print0-0 的组合可安全处理文件名中包含空格的情况。

使用 grep 的递归搜索

基础功能

  • 搜索当前目录及子目录中的字符串
grep -r "abc" .

常用选项

  • -i:忽略大小写。
  • -n:显示匹配行的行号。
  • -l:仅显示包含匹配项的文件名。
  • --exclude="*.txt":排除 .txt 文件。
  • --include="*.cpp":仅搜索 .cpp 文件。

示例

  • 忽略大小写搜索:
grep -ri "abc" .
  • 显示匹配行的行号:
grep -rn "abc" .
  • 排除文件类型:
grep -r "abc" . --exclude="*.txt"

高级用法

  • 正则表达式匹配:查找包含数字的行。
grep "[0-9]" 1.log
  • 上下文匹配:显示匹配行及其前后 5 行。
grep -C 5 "error" 1.log
  • 高亮显示匹配内容
grep --color=auto "error" 1.log

日志过滤

日志过滤可以分为单条件、多条件和排除特定内容三类。

单条件过滤

过滤包含特定字符串 abc 的日志:

cat 1.log | grep abc > 2.log

多条件过滤

过滤包含 abcdef 的日志:

cat 1.log | grep -E "abc|def" > 2.log

排除特定内容

过滤不包含 abc 的日志:

cat 1.log | grep -v 'abc' > 2.log

统计行数

统计日志中包含 abcd 的行数:

grep -c "abcd" 1.log

统计同时包含 abcd1234 的行数:

grep "abcd" 1.log | grep -c "1234"

统计所有日志文件中包含 abcd 的总行数:

grep -r "abcd" . --include="*.log" | wc -l

实际案例

以下是一些实际案例,展示如何使用这些命令解决实际问题。

搜索代码中的函数调用

查找代码中所有调用 myFunction 的位置:

grep -r "myFunction" . --include="*.cpp" --include="*.h"

提取日志中特定时间段的错误信息

假设日志包含时间戳格式 [YYYY-MM-DD HH:MM:SS],提取 2024-12-08 的错误信息:

grep "2024-12-08" 1.log | grep "error"

过滤敏感信息

从日志中排除包含敏感关键词 password 的行:

cat 1.log | grep -v "password"

性能优化

对于大规模文件的搜索,可以使用并行工具如 parallel 提升效率。

并行处理

批量搜索所有 .log 文件中的错误信息:

find . -name "*.log" -type f | parallel grep "error" {}

提示parallel 可以显著提升大规模搜索任务的速度,尤其是在多核机器上。


小结

通过灵活使用 findgrep,我们可以快速高效地搜索代码和日志,同时结合并行工具进一步提升性能。建议将常用命令封装成脚本,方便重复使用,从而提高工作效率。