shell-data-wranglinglisted
Install: claude install-skill AntheaLaffy/the-missing-semester-skills
# 管道与文本处理
主线:`|` 把前一个程序的标准输出接给后一个的标准输入,让简单工具像乐高一样组合——抓日志 → 提取 → 统计 → 排序 → 取前 N,一条命令完成。
## 心智模型
- 三个标准流:stdin(0)、stdout(1)、stderr(2)。多数工具无文件参数时读 stdin、写 stdout。`> file` 覆盖写、`>> file` 追加、`< file` 读文件、`2> file` 只接 stderr、`2>&1` 合并两流。
- `grep` 的 pattern 是正则表达式;`sed` 是可编程流编辑器(`s/pattern/replacement/g` 替换每行所有匹配);`awk` 按列解析(默认空白分隔,`-F,` 换分隔符);`find` 按条件递归找文件(`-exec cmd {} \;` 对每个结果执行命令)。
## 操作契约
- **先看数据再写管道**:先 `head` / `curl -s` 看样本结构和分隔符,再定正则与列号——盲写的正则第一版几乎必错。
- **逐段构建、逐段验证**:管道每接一段就跑一次,确认中间输出符合预期;一步到位的长管道难以调试。
- **计数三连**:`sort | uniq -c | sort -nk1,1` 是「出现频率排序」的标准组合,日志分析高频出现。
- **tee 分叉**:`verbose cmd | tee full.log | grep CRITICAL`——全量日志落盘,终端只留关键行。
- **find 结果交给下一个命令**:`find ... -exec cmd {} \;` 或 `find ... -print0 | xargs -0 cmd`(文件名含空格用后者)。xargs 把 stdin 每行变成命令参数。
- **JSON 用 jq 不用 grep**:`curl -s URL | jq '.[] | select(.version > 6) | .name'`;先 `jq .` 看结构再写选择器。
- **awk 能过滤也能改写**:`awk '$3 ~ /pat/ {$4=""; print}'` 过滤行并删列;提取、求和、统计都行。
- **正则替换可引用捕获**:replacement 里 `\1` 等引用 pattern 的分组。
- **管道变长就升级**:超过 ~10 段或逻辑绕了,写成脚本或换 Python,见 `shell-scripting`。
## 练习
学习材料在 `exercises.md`。
> 改编自 MIT The Missing Semester 课程 Lecture 1: Course overview + the shell(讲义 + 口播稿,CC BY-NC-SA 4.0):https://creativecommons.org/licenses/by-nc-sa/4.0/ · 课程站点:https://missing.csail.mit.edu/ · 讲座视频:https://www.youtube.com/watch?v=MSgoeuMqUmU