Linux 文本处理速查表
你正盯着一个 2GB 的日志文件,试图找出最近一小时内失败的 API 调用。或者你需要从 CSV 导出文件中提取电子邮件地址。这些任务本不应该需要编写 Python 脚本。
本速查表涵盖了 Linux 必备的文本处理命令——grep、awk、sed 及其现代替代工具——并提供了适用于日常前端和全栈开发工作流程的实用示例。
核心要点
grep和ripgrep是跨文件搜索文本的首选工具,ripgrep 为大型代码库提供了速度优势和.gitignore感知能力。sed处理基于流的查找替换操作,但需要注意 GNU 和 BSD 版本之间的行为差异。awk擅长处理日志、CSV 和其他结构化文本的面向列处理。jq填补了grep和awk在处理 JSON 数据时留下的空白。- 管道操作符(
|)是将这些命令链接成强大的可组合管道的粘合剂。
核心搜索命令:grep 和 ripgrep
grep 在文件中搜索模式并输出匹配的行。它是任何文本处理管道的基础。
# 基本模式搜索
grep "error" server.log
# 不区分大小写搜索
grep -i "warning" app.log
# 显示行号
grep -n "TODO" src/*.js
# 反向匹配(不包含模式的行)
grep -v "debug" output.log
# 扩展正则表达式(-E 启用 +、?、| 和分组)
grep -E "error|warning|fatal" app.log
# 仅统计匹配数
grep -c "404" access.log
ripgrep (rg) 是一个更快的替代工具,默认遵循 .gitignore:
# 递归搜索(默认行为)
rg "useState" ./src
# 搜索特定文件类型
rg -t js "async function"
# 显示匹配项周围的上下文
rg -C 3 "Exception" logs/
对于大型代码库,ripgrep 通常比 grep 快 2-5 倍,并自动跳过不相关的文件。
使用 sed 进行文本转换
sed 执行流编辑——无需在编辑器中打开文件即可进行查找替换操作。
# 替换每行的第一个匹配项
sed 's/http/https/' urls.txt
# 替换所有匹配项(全局标志)
sed 's/old/new/g' config.txt
# 删除匹配模式的行
sed '/^#/d' config.ini
# 就地编辑(GNU sed)
sed -i 's/localhost/127.0.0.1/g' .env
# macOS/BSD 需要空的备份扩展名
sed -i '' 's/localhost/127.0.0.1/g' .env
注意:
-i标志在 GNU 和 BSD sed 之间的行为不同。在 macOS 上,始终包含空字符串(-i '')或指定备份扩展名(例如-i .bak)。
使用 awk 进行列处理
awk 擅长处理结构化文本——日志、CSV 和空格分隔的数据。POSIX awk 可以可移植地处理大多数常见任务。
# 打印特定列
awk '{print $1, $4}' access.log
# 自定义字段分隔符(CSV)
awk -F',' '{print $2}' data.csv
# 按条件过滤
awk '$3 > 500 {print $1, $3}' response_times.log
# 对列求和
awk '{sum += $2} END {print sum}' sales.csv
# BEGIN/END 块用于标题
awk 'BEGIN {print "User\tCount"} {print $1, $2}' stats.txt
必备的辅助命令
# 排序和去重(带计数,降序)
sort access.log | uniq -c | sort -rn
# 按分隔符提取列
cut -d',' -f1,3 users.csv
# 字符转换(小写转大写)
tr '[:lower:]' '[:upper:]' < input.txt
# 统计文件行数
wc -l package.json
# 按名称模式查找文件
find ./src -name "*.test.js" -type f
Discover how at OpenReplay.com.
使用 jq 处理 JSON
对于现代 Web 开发,jq 处理 grep 和 awk 无法干净处理的 JSON 解析:
# 提取字段
jq '.data.users' response.json
# 过滤数组元素
jq '.items[] | select(.status == "active")' data.json
# 格式化 API 响应
curl -s https://api.example.com/users | jq '.[].email'
注意上面的第一个示例避免了无用的 cat 使用。jq 可以直接读取文件,因此 cat response.json | jq '...' 是不必要的。
实用管道示例
从日志中过滤今天的错误:
grep "$(date +%Y-%m-%d)" app.log | grep -i error | awk '{print $4, $5}'
提取唯一的 IP 地址:
awk '{print $1}' access.log | sort -u
按行数查找项目中最大的文件:
find . -type f -name "*.js" -exec wc -l {} + | sort -rn | head -10
清理 CSV 数据(提取列、去除引号、去重):
cut -d',' -f2,4 export.csv | sed 's/"//g' | sort -u
快速参考
| 任务 | 命令 |
|---|---|
| 搜索模式 | grep "pattern" file |
| 快速递归搜索 | rg "pattern" |
| 替换文本 | sed 's/old/new/g' file |
| 提取列 | awk '{print $1}' file |
| 解析 JSON | jq '.key' file.json |
| 排序和去重 | sort -u file |
| 统计行数 | wc -l file |
结论
掌握这些 Linux 文本处理命令,你就能直接从终端处理大多数日志分析、数据提取和文件转换任务。从用于搜索的 grep 开始,添加用于列处理的 awk,当涉及 JSON 时使用 jq。管道操作符(|)将所有内容联系在一起,让你能够将小而专注的命令组合成可与专用脚本媲美的管道。
常见问题
当你的数据具有一致的单字符分隔符并且你只需要获取特定字段时,使用 cut。当你需要按条件过滤行、执行算术运算或处理不规则空格时,使用 awk。awk 默认将连续的空格视为单个分隔符,这使得它在处理日志文件和命令输出时更加宽容。
对于大多数开发者工作流程来说,是的。ripgrep 更快,遵循 .gitignore,并使用合理的默认设置(如递归搜索)。但是,grep 在几乎所有 Unix 系统上默认可用,这使得它成为可移植 shell 脚本的更安全选择。如果你编写的脚本要在最小化服务器或容器上运行,请坚持使用 grep。
始终先在不使用 -i 标志的情况下测试你的 sed 命令,以在终端中预览输出。当你准备好就地编辑时,在 GNU 系统上使用备份扩展名,如 sed -i .bak。在 macOS 或 BSD 上,语法是 sed -i .bak。这会在应用更改之前创建原始文件的副本,为你提供回滚选项。
可以。jq 专为导航深度嵌套的结构而构建。使用点表示法遍历对象,使用方括号表示法处理数组,使用管道表达式链接过滤器。例如,jq '.data.users[] | select(.active == true) | .email' 会进入嵌套数组,按条件过滤,并提取字段,所有这些都在一个命令中完成。
Gain control over your UX
See how users are using your site as if you were sitting next to them, learn and iterate faster with OpenReplay. — the open-source session replay tool for developers. Self-host it in minutes, and have complete control over your customer data. Check our GitHub repo and join the thousands of developers in our community.