Shell脚本精读 · S10-01 | 何时用 Shell、何时用 awk/sed:分工原则 模块S10 文本处理协作篇号S10-01 / 42预计阅读40 分钟主线Bash文章目录本篇目标30 秒速览正文1. 为什么需要分工2. 一张选型表3. Shell编排与胶水4. grep筛行、判断存在5. sed流式编辑替换、删行6. awk按列处理与报表7. 管道里的分工8. 反模式读脚本时警惕9. 环境里没有 awk/sed 时10. 读脚本的三问读脚本检查清单练习判断题选型题读脚本题下一篇预告本篇目标建立Shell 与 grep/sed/awk的分工观Shell 负责流程、文件、进程、退出码专用工具负责按行/按列处理文本。能判断一段逻辑该留在 Bash、该交给谁避免把 awk 程序整段塞进$( )或用forcut拼复杂报表。为S10-02grep、S10-03sed/awk 胶水打选型基础。30 秒速览Shell 强项调命令、判退出码、循环文件、环境变量、管道串联。grep 强项有没有、筛哪些行模式匹配。sed 强项按规则改文本替换、删行、简单提取。awk 强项按列/字段统计、求和、格式化输出表格、报表。原则Shell 当胶水文本算法交给合适工具别在 Bash 里手写 CSV 解析器。读完脚本先认「编排」还是「数据处理」。正文1. 为什么需要分工Bash什么都能沾一点但下列写法往往难维护# 反例用纯 Shell 解析 /etc/passwd 第七列whileIFS:read-r_ _ _ _ _ _ homedir _;do...done/etc/passwd同样任务awk -F:常更短、更清晰S10-03 给一键示例。Shell 的价值是决定读哪个文件、失败怎么办、结果往哪送。#!/usr/bin/env bashset-euopipefail[[-f/etc/passwd]]||exit1awk-F:$3 1000 {print $1, $6}/etc/passwd2. 一张选型表你想做的事优先工具Shell 做什么文件在不在、权限、复制移动Shell[ -f ]cpmv全流程日志里有没有 ERRORgrep-q/ 管道if grep ...; then删掉行首#注释sed调 sed检查$?把ab改成export absed输入输出重定向统计第三列之和awk传文件路径、处理退出码批量重命名 50 个文件Shellformv循环与路径从 JSON 取字段jq若环境有胶水别硬用 awk 解析 JSON并行下载 3 个 URLShellwaitS09-04编排3. Shell编排与胶水适合留在 Bash 的set -euo pipefail、参数检查、usagefor f in $; do遍历文件if/case分支、exit码管道串联grep ... | awk ... | sort调用curl、git、make、docker等外部命令main(){(($#1))||usageforlogin$;do[[-f$log]]||continueifgrep-qERROR$log;thenreport_error$logfidone}Shell 不必擅长复杂字符串算法、大文件逐字符处理、多维统计。4. grep筛行、判断存在典型ifgrep-q^ERROR$LOG;thenalertfigrep-h^#$CONF||true# 只看注释行用 grep不必 grep模式匹配行按第 N 列求和用 awkif grep -q判断替换文本用 sed多个文件同一模式复杂状态机解析细节在S10-02-E、-F、递归-r等。5. sed流式编辑替换、删行一行式在脚本里很常见sed-i.baks/\r$//$file# 去 CRLFsed/^$/dinput.txt# 删空行sed-n1,10phuge.log# 只打印前 10 行用 sed考虑 awk / 其它单模式替换s/old/new/多列条件($3100)按地址删行/^#/d聚合统计sum、count简单提取结构化数据 JSON →jq-i原地改文件脚本里注意备份、权限失败要检查退出码。6. awk按列处理与报表典型# 统计 access.log 里状态码 500 的次数示意第 9 列为状态码awk$9 500 {c} END {print c0}access.log# 打印 passwd 里 UID1000 的用户名与家目录awk-F:$3 1000 {print $1, $6}/etc/passwd用 awk用 Shell 就够指定分隔符、字段号$1$NF整行原样cat、移动文件END {print sum}汇总只有grep 有没有格式化列对齐printf两三个if分支不必为 awk 写长篇教程脚本里多数是-F、模式、print的一键调用S10-03。7. 管道里的分工grepERROR app.log\|awk{print $1, $2}\|sort\|uniq-c\|sort-nr读法grep只要 ERROR 行awk取前两列sort / uniq / sortShell 外置命令仍是胶水链set -o pipefailS09-02grep无匹配时整条链应失败别被后面sort掩盖。8. 反模式读脚本时警惕反模式问题更好for line in $(cat f)拆词、丢格式while read -r或awk超长$(awk ...)难调试、引号地狱awk 读文件或here-doc 程序纯 Shell 解析 CSV逗号、引号易错awk -F,或 Pythonsed 算总数awk 更合适awk {s$3} END{print s}grep 当计算器做不到awk / bc / $(( ))9. 环境里没有 awk/sed 时最小系统可能只有busybox子集读脚本看 shebang 与文档。可移植脚本S13避免 GNU 独有扩展或检测command -v awk。专栏主线是Bash 常见 GNU/Linux 工具链嵌入式/极简环境另论。10. 读脚本的三问这段是在「调命令」还是在「算文本」→ 算文本找 grep/sed/awk 边界。失败谁负责→ Shellset -e、pipefail、if cmd。数据规模→ 大文件避免$(cat huge)进变量用流式管道 / awk 一行流。读脚本检查清单复杂列操作是否该用awk却用cutwhile硬拼是否只需grep -q却grep | wc -lsed -i是否有备份、是否检查失败管道左端grep/awk失败会不会被sort盖住pipefailJSON/XML 是否误用 awk 硬解析练习判断题Shell 不适合做「遍历目录 调外部命令」的编排。判断日志是否含 ERROR优先grep -q。把文件中所有foo换成bar优先 sed。求 CSV 第三列数值总和优先 awk。专栏要求你把 awk 语法从头到尾背下来才能写脚本。参考答案错这正是 Shell 强项。对。对。对。错S10-03 学「胶水式一键调用」即可。选型题各题选Shell / grep / sed / awk主工具可多选「Shell 工具」检查config.ini是否包含enabledyes删除notes.txt里所有空行打印sales.csv中金额第 4 列大于 1000 的行对reports/*.log逐个调用gzip统计access.log中 HTTP 状态码 404 的出现次数状态码在第 9 列参考答案grep Shell 判$?sed Shell 重定向/备份awkShellforawk或 grep 404 再 wc但列位置明确时 awk 更准读脚本题说明下面片段各自依赖什么工具完成什么分工forfin$;doseds/\t/,/g$f|awk-F,$4 0 {print $1,$4}|sort-t,-k2-nrdone参考答案Shell遍历参数文件。sedTab 改逗号若已是 CSV 可能多余。awk按逗号字段过滤第 4 列 0打印第 1、4 列。sort按第 2 列数值降序此处列与 awk 输出字段对应关系需与数据一致读脚本时要核对。下一篇预告S10-02《grep/egrep与脚本过滤与if grep -q》— 模式、递归、退出码与grep | ...管道。