Back

Linux 文本处理速查表

Linux 文本处理速查表

你正盯着一个 2GB 的日志文件,试图找出最近一小时内失败的 API 调用。或者你需要从 CSV 导出文件中提取电子邮件地址。这些任务本不应该需要编写 Python 脚本。

本速查表涵盖了 Linux 必备的文本处理命令——grepawksed 及其现代替代工具——并提供了适用于日常前端和全栈开发工作流程的实用示例。

核心要点

  • grepripgrep 是跨文件搜索文本的首选工具,ripgrep 为大型代码库提供了速度优势和 .gitignore 感知能力。
  • sed 处理基于流的查找替换操作,但需要注意 GNU 和 BSD 版本之间的行为差异。
  • awk 擅长处理日志、CSV 和其他结构化文本的面向列处理。
  • jq 填补了 grepawk 在处理 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

使用 jq 处理 JSON

对于现代 Web 开发,jq 处理 grepawk 无法干净处理的 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
解析 JSONjq '.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.

OpenReplay