跳到正文

常用文本工具 ​

这些工具都很小,组合起来却能完成很复杂的文本处理。记它们的输入输出比记选项更重要。

工具速查 ​

工具用途常见写法
man / --help查用法man ls
tldr只看例子tldr find
cat / less查看文件less app.log
head / tail头尾几行tail -f app.log
sort排序sort -k2,2n
uniq去相邻重复uniq -c
grep按正则找行grep -rn TODO .
sed流式替换sed -E 's/a/b/g'
find按条件找文件find . -name '*.py'
awk按列处理awk -F, '{print $2}'
jq处理 JSONjq '.items[].name'

单条命令解决不了的问题,通常是把其中三四个接成管道。

组合套路 ​

bash
# 出现最多的十行
sort file | uniq -c | sort -nr | head

# 七天内的 Python 文件
find . -name '*.py' -mtime -7

# 含 TODO 的文件
find . -name '*.py' -exec grep -l TODO {} \;

# CSV 第二列求和
awk -F, '{sum += $2} END {print sum}' data.csv

sort | uniq -c 是频次统计的固定写法,uniq 只处理相邻重复,所以必须先排序。

find 与 xargs ​

需求写法
按名字find . -name '*.log'
按时间find . -mtime -7
按大小find . -size +100M
逐个执行-exec cmd {} \;
批量执行-print0 | xargs -0 cmd

文件名可能带空格,-print0 加 xargs -0 比 -exec 更稳。

日志分析 ​

bash
ssh myserver 'journalctl -u sshd -b-1 | grep "Disconnected from"' \
  | sed -E 's/.*user (.*) [^ ]+ port.*/\1/' \
  | sort | uniq -c | sort -nr | head
  • 远端:取日志、过滤行
  • 本地:抽取用户名、排序、计数

每一段只做一件事,失败时也容易单独调试。

换现代工具之前,先确认目标机器上装得上;很多服务器只保证 POSIX 那套。

现代替代 ​

传统现代差异
greprg默认递归、更快、尊重 .gitignore
findfd语法更短、默认忽略隐藏目录
catbat语法高亮、分页
sedsd替换语法更直观
modern-unix常见 Unix 命令的现代替代品合集