Skip to content

Linux 查找文件和内容:find、grep、管道与重定向 ​

Linux 服务器入门 · 第 09 篇 / 共 18 篇

“文件在哪”和“文件里写了什么”是两个问题。前者交给 find,后者交给 grep。这一节先分别做,再把命令连起来。

以下命令在服务器执行,使用自己的 ~/linux-practice。先创建一份六行教学日志;已有同名文件时,这一步会覆盖它,先确认不是你要保留的真实日志。

bash
mkdir -p ~/linux-practice/logs ~/linux-practice/reports
cd ~/linux-practice
cat > logs/app.log <<'EOF'
2026-10-18T09:00:00+08:00 INFO job=demo01 started
2026-10-18T09:00:01+08:00 INFO job=demo01 reading /data/input.csv
2026-10-18T09:00:02+08:00 ERROR job=demo01 input file missing
2026-10-18T09:00:03+08:00 WARN job=demo01 retry scheduled
2026-10-18T09:00:04+08:00 ERROR job=demo01 retry failed
2026-10-18T09:00:05+08:00 INFO job=demo01 stopped
EOF

cat > ... <<'EOF' 把中间的文字原样写入文件,最后一行 EOF 要独占一行。这份样例只有两行包含 ERROR,后面会用它核对结果。

先找文件名 ​

bash
find . -type f -name '*.log'

. 是起始目录;-type f 只找普通文件;-name 按名称匹配。给 *.log 加引号,让它由 find 处理,而不是先被 Shell 展开。当前目录不同,搜索范围就不同。

若只想查 logs,把 . 换成 logs。不要初学就从整个 / 搜起:范围过大,还会遇到很多与你无关的权限提示。find 手册说明了搜索范围与条件。

再找文件中的文字 ​

bash
grep -n ' ERROR ' logs/app.log

这里用两边带空格的 ERROR 匹配样例的级别字段,避免把其他单词里的字符片段也算进去。-n 输出原文件行号,本例匹配第 3、5 行。

grep -i 可忽略大小写;grep -v 输出不匹配的行。例如排除 INFO 行,可用 grep -v ' INFO ' logs/app.log。如果程序采用别的日志格式,就要换合适的匹配条件。

输出继续交给下一条命令 ​

日志先交给 grep 筛选 ERROR 行,再交给 wc -l 统计行数;筛选结果也可重定向到报告。

数据流示意。管道传递标准输出;保存明细和统计数量可以分别做。
bash
grep ' ERROR ' logs/app.log | wc -l

| 把左侧的标准输出作为右侧输入,wc -l 统计换行数量。本例结果是 2。这表示匹配行数,不保证等于实际错误事件数量;一次异常也可能产生多行记录。

普通管道不会自动传递标准错误,而且默认常以最后一条命令的状态作为整条管道的状态。别因为 wc 打出了数字,就认定输入文件一定读成功;先单独确认 grep 没有报错。

把明细保存成新文件 ​

bash
grep ' ERROR ' logs/app.log > reports/errors.txt
cat reports/errors.txt
wc -l reports/errors.txt

> 会创建或覆盖目标;>> 用于追加。不要把读取的输入文件同时当成 > 的输出文件,Shell 可能先清空它。报告放在单独目录更容易核对。

grep 找不到匹配时通常不显示行,退出状态为 1;文件不存在等执行错误通常会有报错并返回其他非零状态。这两种情况要区分,可查 grep 手册。

自己练习:只保存 WARN 行到另一个报告文件,核对应该有 1 行;不要覆盖刚才的错误明细。