运维专用 Linux 管道教程:用一行命令完成日志、磁盘、API 与批量文件处理

> 来源文章:How-To Geek《9 essential command pipelines that simplify everyday Linux》 > 原文 URL:https://www.howtogeek.com/essential-command-pipelines-that-simplify-everyday-linux/ > 本教程定位:基于原文管道示例,改写为运维场景可直接复用的实践手册。文中“实战扩展”是面向运维工作的补充,不代表原文逐字内容。

改写后的清晰任务

把原文的 Linux 管道示例,整理成一篇面向运维人员的实用教程:按常见运维场景组织,提供可复制命令、样本数据、预期输出、验收方法和故障处理,并明确哪些做法不适合生产安全场景。

我做的改写:把“提炼为教程”具体化为“运维场景 + 可执行命令 + 验收标准 + 风险提示”,避免只写成概念总结。

适用对象

核心原则

Linux 管道的价值不是“命令炫技”,而是把多个小工具串成一个临时数据处理流程:

命令A产生数据 | 命令B过滤/转换 | 命令C排序/统计 | 命令D保存/展示

生产环境使用时遵守三条规则:

1. 先只读验证,再执行修改:涉及 cpmvrmxargs 时先加 echo-n 预演。 2. 保留证据:排障命令输出建议用 tee 保存一份。 3. 不要把弱随机当密码:原文提到 date | md5sum 生成字符串,这只能用于临时测试 ID,不能用于密码或 Token。

准备一个安全练习目录

以下命令只在 /tmp/pipeline-lab 中创建样本,不影响系统真实日志。

mkdir -p /tmp/pipeline-lab/{logs,dir1,dir2,data}
cd /tmp/pipeline-lab

cat > logs/access.log <<'EOF'
10.0.0.1 - - [19/May/2026:10:00:01 +0800] "GET /api/users HTTP/1.1" 200
10.0.0.2 - - [19/May/2026:10:00:02 +0800] "GET /api/orders HTTP/1.1" 500
10.0.0.1 - - [19/May/2026:10:00:03 +0800] "GET /api/users HTTP/1.1" 200
10.0.0.3 - - [19/May/2026:10:00:04 +0800] "POST /login HTTP/1.1" 401
10.0.0.2 - - [19/May/2026:10:00:05 +0800] "GET /api/orders HTTP/1.1" 500
EOF

cat > logs/app.log <<'EOF'
2026-05-19 10:01:00 INFO service started
2026-05-19 10:01:03 ERROR db timeout
2026-05-19 10:01:06 WARN retry request_id=abc
2026-05-19 10:01:10 ERROR upstream 502
EOF

cat > data/health.json <<'EOF'
{"service":"order-api","status":"degraded","latency_ms":842,"errors":17}
EOF

touch report.md
truncate -s 2M data/a.bin
truncate -s 10M data/b.bin
truncate -s 1M data/c.bin

验收:

find /tmp/pipeline-lab -maxdepth 2 -type f | sort

预期至少看到:

/tmp/pipeline-lab/data/a.bin
/tmp/pipeline-lab/data/b.bin
/tmp/pipeline-lab/data/c.bin
/tmp/pipeline-lab/data/health.json
/tmp/pipeline-lab/logs/access.log
/tmp/pipeline-lab/logs/app.log
/tmp/pipeline-lab/report.md

场景 1:日志太长,先过滤再分页

适用场景:日志文件很大,直接 grep 输出刷屏,需要慢慢看。

grep 'ERROR' logs/app.log | less

如果当前环境不方便打开交互式 less,可以先用:

grep 'ERROR' logs/app.log

预期输出:

2026-05-19 10:01:03 ERROR db timeout
2026-05-19 10:01:10 ERROR upstream 502

运维要点:

常见失败:

场景 2:实时监听日志里的异常

适用场景:服务刚重启、刚发布、刚恢复,需要观察新日志中是否继续出现异常。

tail -f logs/app.log | grep --line-buffered 'ERROR'

另开一个终端模拟新日志:

printf '%s\n' '2026-05-19 10:02:00 ERROR payment timeout' >> /tmp/pipeline-lab/logs/app.log

预期第一个终端立刻出现:

2026-05-19 10:02:00 ERROR payment timeout

关键点:

生产建议:

tail -f /var/log/nginx/error.log | grep --line-buffered -E 'timeout|502|503|504'

场景 3:统计访问 IP 或错误来源

适用场景:快速判断是否某个 IP 请求异常集中,或某类访问占比过高。

样本命令:

cut -d' ' -f1 logs/access.log | sort | uniq -c | sort -nr

预期输出类似:

      2 10.0.0.2
      2 10.0.0.1
      1 10.0.0.3

命令拆解:

进一步统计 HTTP 状态码:

awk '{print $9}' logs/access.log | sort | uniq -c | sort -nr

预期输出:

      2 500
      2 200
      1 401

故障处理:

场景 4:把排障结果同时显示和存档

适用场景:值班排障时既要看结果,又要把证据保存到工单或复盘材料。

df -h | tee diskusage.txt

验收:

test -s diskusage.txt && echo 'diskusage.txt 已保存'

预期输出:

diskusage.txt 已保存

常见变体:

# 保存并继续过滤,只看根分区或关键挂载点
df -h | tee diskusage.txt | grep -E '/$|/data|/var'

# 追加保存,不覆盖旧文件
df -h | tee -a diskusage-history.txt

注意:

场景 5:快速定位大文件和大目录

适用场景:磁盘告警、根分区满、日志目录异常膨胀。

du -sh data/* | sort -h

预期输出:

1.0M	data/c.bin
2.0M	data/a.bin
10M	data/b.bin

如果想看最大的排在前面:

du -sh data/* | sort -hr

生产常用版本:

sudo du -xh --max-depth=1 /var 2>/dev/null | sort -hr | head -20

命令拆解:

故障处理:

场景 6:批量复制同一个文件到多个目录

适用场景:把同一个配置模板、README 或检查脚本分发到多个本地目录。

先预演,不真正复制:

echo 'dir1 dir2' | xargs -n 1 echo cp -v report.md

预期输出:

cp -v report.md dir1
cp -v report.md dir2

确认无误后执行:

echo 'dir1 dir2' | xargs -n 1 cp -v report.md

验收:

ls dir1/report.md dir2/report.md

风险提示:

路径含空格时,更安全的模式是使用 NUL 分隔:

printf '%s\0' 'dir1' 'dir2' | xargs -0 -n 1 echo cp -v report.md

场景 7:处理 API 返回的 JSON

适用场景:健康检查、内部 API 调试、自动化脚本前置验证。

先确认本机有 jq

command -v jq

从样本 JSON 提取字段:

cat data/health.json | jq -r '.service, .status, .latency_ms'

预期输出:

order-api
degraded
842

实际 API 示例:

curl -s https://catfact.ninja/fact | jq -r '.fact'

运维健康检查模板:

status=$(cat data/health.json | jq -r '.status')
if [ "$status" != "ok" ]; then
  echo "服务状态异常: $status"
fi

故障处理:

场景 8:从历史命令中找回排障命令

适用场景:上次修过同类问题,但忘了完整命令。

history | grep 'du -sh'

更稳一点:

history | grep -E 'journalctl|kubectl|du -sh|grep ERROR'

注意:

可复用运维别名

把这些加入个人 shell 配置前,先手动运行确认适合你的环境。

# 当前目录按大小排序
alias fsize='du -sh * 2>/dev/null | sort -h'

# 查看最近系统错误日志,适用于 systemd 主机
alias jerr='journalctl -p err -n 100 --no-pager'

# Nginx 访问 IP Top 20,按你的日志路径调整
alias nginx-ip-top="awk '{print \$1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -20"

修改后生效:

source ~/.bashrc

不推荐照搬的做法

原文提到:

date | md5sum

这可以生成一段看起来随机的字符串,但不要用于密码、Token、密钥、盐值或任何安全用途。原因:时间戳可预测,md5 也不是现代密码学安全选择。

临时测试 ID 可以用:

date +%s%N | sha256sum | cut -c1-12

真正需要密码或 Token 时用:

openssl rand -base64 24

或:

python3 - <<'PY'
import secrets
print(secrets.token_urlsafe(24))
PY

运维使用管道的检查清单

执行前:

执行后:

最小练习路线

建议按这个顺序练习:

1. grep | less:先学会过滤和分页。 2. tail -f | grep:学会实时观察。 3. cut/awk | sort | uniq -c:学会统计。 4. du -sh | sort -h:学会磁盘定位。 5. tee:学会保留证据。 6. xargs:最后再碰批量修改类操作。

完成标准:你能在不写脚本的情况下,用一行命令回答这三个问题:

1. 最近日志里有哪些 ERROR?
2. 哪些 IP 访问最多?
3. 当前目录下哪个文件或目录最大?

附:一页速查

# 过滤并分页
grep 'ERROR' app.log | less

# 实时过滤日志
tail -f app.log | grep --line-buffered 'ERROR'

# 统计访问 IP
awk '{print $1}' access.log | sort | uniq -c | sort -nr | head

# 统计状态码
awk '{print $9}' access.log | sort | uniq -c | sort -nr

# 显示并保存磁盘使用
df -h | tee diskusage.txt

# 当前目录大小排序
du -sh * 2>/dev/null | sort -h

# JSON 字段提取
curl -s 'https://example.com/health' | jq -r '.status'

# xargs 预演批量复制
echo 'dir1 dir2' | xargs -n 1 echo cp -v report.md

结论

对运维来说,管道不是语法点,而是“现场数据处理能力”。先从只读排查类命令开始,把过滤、统计、排序、保存证据练熟;再谨慎进入 xargs 这类批量修改场景。能用一行管道安全解决的问题,就不要急着写临时脚本。