问题与目标
日志和命令输出通常是文本流。与其写一个很长的脚本,不如让多个小工具各做一步,再通过管道组合。
完成标准:能区分标准输入、标准输出和标准错误,正确使用重定向,并用 grep、sed、cut、awk 完成一次日志统计。
核心概念
进程默认有三个数据通道:标准输入 0、标准输出 1、标准错误 2。> 覆盖输出文件,>> 追加,2> 重定向错误,2>&1 把错误合并到当前标准输出。
管道 | 把左侧标准输出交给右侧标准输入,不会自动传递标准错误。grep 负责筛选,sed 适合替换或选行,cut 按固定分隔符取列,awk 更适合按字段统计。
选择工具时先看数据结构:
| 工具 | 适合的问题 | 示例 |
|---|---|---|
grep | 哪些行匹配 | `grep -nE 'ERROR |
sed | 对每行做简单替换或选取 | sed -n '1,10p' app.log |
cut | 单字符分隔、字段规则固定 | cut -d: -f1 /etc/passwd |
awk | 按字段判断、计算和汇总 | awk '$2=="ERROR" {count++} END {print count}' |
可运行实现
创建示例日志:
bash
mkdir -p ~/pipeline-demo
cd ~/pipeline-demo
printf '%s\n' \
'2026-08-25 INFO /health 200 12' \
'2026-08-25 ERROR /tasks 500 83' \
'2026-08-25 INFO /tasks 200 31' \
'2026-08-25 ERROR /tasks 500 65' > access.log
筛选错误并统计路径:
bash
grep ' ERROR ' access.log |
awk '{count[$3]++} END {for (path in count) print path, count[path]}' |
sort
输出:
text
/tasks 2
其他常见组合:
bash
cut -d' ' -f2,3 access.log
sed 's/ ERROR / WARN /' access.log > normalized.log
grep -nE ' (4[0-9]{2}|5[0-9]{2}) ' access.log
command_that_may_fail >run.log 2>&1
需要同时查看并保存输出时使用 tee:
bash
grep ' ERROR ' access.log | tee errors.log | wc -l
管道失败必须能够传到脚本出口:
bash
set -o pipefail
grep ' ERROR ' missing.log | awk '{print $3}'
status=$?
echo "pipeline status=$status"
不启用 pipefail 时,管道状态通常只取最后一条命令,前面的文件不存在可能被掩盖。需要分别保存标准输出和错误时使用 >result.txt 2>error.txt。
常见问题与排查
>会清空原文件;保留历史内容时使用>>,重要文件操作前先核对目标路径。grep没匹配时退出码是 1,在set -e脚本中需要明确接受,例如grep pattern file || true,但不要掩盖真正错误。- 把“无匹配”和“文件读取失败”都写成
|| true:会失去排查证据;应先检查退出码或在脚本中为两种情况分别处理。 cut不擅长处理连续数量不定的空白;此时awk的默认字段切分更合适。- 复杂 CSV 含引号和换行时,不应靠
cut/awk硬拆,应使用 Pythoncsv模块或专用解析器。 - 用
tee写入需要 root 权限的文件时,权限发生在tee,而不是管道左侧。
小结
文本自动化的思路是“先筛选,再变换,最后汇总”。管道适合结构简单的文本流;遇到严格格式、嵌套结构或复杂错误恢复,应转向专用解析器或 Python。
许可协议:CC BY-NC 4.0
更新于 2 小时前
觉得文章有帮助?点个赞吧!
0 条评论


