跳到主要内容

查看、搜索和处理文本

本节目标

dev-lab 内查看一份固定访问日志,使用 catlessheadtailgrepcutsortuniqwc 逐步观察、筛选和汇总文本,而不改动原始数据。

开始前状态

你已完成路径练习,并从 dev-lab 根目录开始。本节只新建 dev-lab/data/access.log;后续操作全部读取它,命令结果先显示在终端。日志不是系统日志,也不需要网络、机器时钟或下载任何脚本。

必要原理

文本处理先观察整份输入,再缩小范围或组合命令。cat 直接输出文件;less 适合分页阅读,按 q 退出,避免把等待输入误认为终端卡住。headtail 分别观察开头和结尾,grep 按模式筛选行,cut 按分隔符取字段,sort | uniq -c 把相邻的同类行计数,wc -l 计算行数。

日志的四列依次是时间戳、方法、路径和状态码。课程主线使用 Bash 兼容语法;macOS 的 zsh 也能运行这些命令。只要看到同一组六行输入和相同数字即可,不需要比较不同系统对空格的显示格式。

动手完成

运行位置: dev-lab 根目录。预期输出: 先检查 data/access.log 不存在,再创建固定的六行日志并用 cat 完整显示它。失败处理: 若目标已存在,这个代码块会打印“目标已存在,停止并检查:data/access.log”并以非零状态结束;立即停止本节,不要运行后面的处理代码块,也不要覆盖未知文件。

(
if [[ -e data/access.log ]]; then
printf '目标已存在,停止并检查:%s\n' data/access.log
exit 1
fi
cat > data/access.log <<'LOG'
2026-08-12T09:00:00Z GET / 200
2026-08-12T09:00:01Z GET /docs/devenv/welcome 200
2026-08-12T09:00:02Z GET /docs/devenv/module-route 200
2026-08-12T09:00:03Z GET /missing 404
2026-08-12T09:00:04Z POST /practice 200
2026-08-12T09:00:05Z GET /old-link 404
LOG
cat data/access.log
)

运行位置: 同一个目录。预期输出: less 分页展示同一份日志,head -n 2tail -n 2 分别显示两端各两行。失败处理: less 打开后按 q 退出;不要用中断或关闭终端来代替退出。

less data/access.log
head -n 2 data/access.log
tail -n 2 data/access.log

运行位置: 同一个目录。预期输出: grep ' 404$' 只显示两条失败请求,cut -d ' ' -f 2 只显示每行的方法字段。失败处理: 若结果不符,先 cat data/access.log 确认空格与状态码;不要修改日志去凑结果。

grep ' 404$' data/access.log
cut -d ' ' -f 2 data/access.log

运行位置: 同一个目录。预期输出: 方法汇总为 5 个 GET 和 1 个 POST,总请求数为 6。失败处理: 先单独运行 cut 观察字段,再把它接到组合命令;组合只读取原始日志。

cut -d ' ' -f 2 data/access.log | sort | uniq -c
wc -l < data/access.log

观察结果

日志的第一、最后两行来自 headtailgrep 找到 /missing/old-link 两条 404;cut 把四列日志缩成方法列。sort 让相同方法相邻,uniq -c 才能计数。整个过程中只有第一次明确写入固定日志,后续命令都是读取。

常见问题

less 为什么像是没有返回提示符? 它在等你翻页或退出。按 q 回到 Shell。

为什么不直接先运行复杂管道? 单独观察输入和字段能证明每一步的数据形状;发现问题时也知道该回到哪一步检查。

完成检查

  • data/access.log 恰有六行固定访问日志,且之后没有被修改;
  • 能用 head -n 2tail -n 2grep ' 404$'cut -d ' ' -f 2 分别观察边界、失败行和方法;
  • 能解释 sort | uniq -cwc -l 的结果;
  • 知道在 less 中按 q 退出,且没有向 output/ 写入任何文件。

下一步

下一节把这份不变的日志转换为可检查的摘要,练习重定向、stdout 管道、stderr 分离与 && 的短路行为。