Linux 运维 5 个"小而美"的命令:wc / which / whereis / diff / sort+uniq 一篇打包
这 5 个命令单独看都不起眼,但在生产排障、日志分析、配置对比、Top N 统计里几乎天天用。关键词:wc · which · whereis · type · diff · vimdiff · sort · uniq · 管道 · 日志分析一、wc —— 统计行数 / 字数 / 字节数
wc(word count)原本是统计单词、字符的,实际工作中 90% 用来数行数。
1.1 常用选项
| 选项 | 含义 |
|---|
-l | line,行数(最常用 ★) |
-w | word,单词数 |
-c | char,字节数 |
-m | 字符数(UTF-8 一个汉字算 1,-c 算 3) |
-L | 最长一行的长度 |
1.2 案例:统计 /etc/services 行数
wc -l /etc/services# 11176 /etc/services
1.3 真正的威力是配合管道
# 当前系统有多少个用户wc -l /etc/passwd# 当前有多少个进程ps -ef | wc -l# 今天的 access.log 有多少条 5xx 错误grep ' 5[0-9][0-9] ' /var/log/nginx/access.log | wc -l# 某用户当天登录失败次数(脚本里常用做判断)grep "Failed password" /var/log/secure | grep "user001" | wc -l
1.4 在脚本里做判断
fail=$(grep "Failed password" /var/log/secure | wc -l)if [ "$fail" -gt 100 ]; thenecho "登录失败超过 100 次,疑似暴力破解!" | mail -s "ALERT" ops@example.comfi
💡 一个小优化:grep -c 'pattern' file 可以直接出行数,不用再 | wc -l。
二、which / whereis / type —— 命令到底在哪?
2.1 which:只告诉你可执行文件在哪
which wc mkdir sed awk ping ip shutdown# /usr/bin/wc# /usr/bin/mkdir# /usr/bin/sed# /usr/bin/awk# /usr/bin/ping# /usr/sbin/ip# /usr/sbin/shutdown
2.2 whereis:命令本体 + 源代码 + man 手册
whereis awk# awk: /usr/bin/awk /usr/libexec/awk /usr/share/awk /usr/share/man/man1/awk.1.gzwhereis -b ls# -b 只看二进制# ls: /usr/bin/lswhereis -m ls# -m 只看 man 手册# ls: /usr/share/man/man1/ls.1.gz
2.3 补充:type(Bash 内置,更准)
which 在某些 shell 里看不到别名 / 函数 / 内置命令,会误导你。生产里优先用 type:
type cd# cd is a shell builtintype ll # ll is aliased to `ls -l --color=auto'type -a ls# 列出所有同名命令type -P ls# 类似 which,只回显路径command -v ls# POSIX 兼容写法
2.4 补充:find / locate —— 找的不是命令而是文件
find /etc -name "*.conf" -mtime-1# 一天内修改过的 conflocate nginx.conf # 秒查(依赖 mlocate 数据库)sudo updatedb # 手动刷新 locate 数据库
三、diff / vimdiff —— 配置文件对比
升级软件、回滚配置、Code Review,绕不开"两份文件比一比"。
3.1 准备演示文件
vim demo-a.txt demo-b.txt# 编辑完一个文件,:w 保存,:n 切到下一个,:N 切回上一个
3.2 diff 默认输出
diff demo-a.txt demo-b.txt# 1a2# > demo-line
输出含义:
| 符号 | 含义 |
|---|
a | append,新增 |
c | change,修改 |
d | delete,删除 |
1a2 表示:在 a 文件的第 1 行后面追加(对应 b 文件的第 2 行)。
3.3 更易读的两种输出
# unified 格式(Git 风格 ★ 推荐)diff -u demo-a.txt demo-b.txt# 并排显示(终端宽就用它)diff -y demo-a.txt demo-b.txtdiff -y --suppress-common-lines a.conf b.conf
3.4 整目录递归对比
diff -r /etc/nginx/ /backup/nginx-2026-06-13/diff -rq dir1 dir2 # 只列出哪些文件不同(quiet 模式 ★)
3.5 vimdiff —— 全屏分屏对比
vimdiff old.conf new.conf
常用快捷键:
| 快捷键 | 作用 |
|---|
]c / [c | 跳到下一个 / 上一个差异 |
do | diff obtain,把对面的内容拉过来 |
dp | diff put,把本边的内容推过去 |
:diffupdate | 重新计算差异 |
Ctrl+w w | 切换左右窗口 |
:qa! | 全部退出不保存 |
3.6 现代化替代品(强烈推荐试试)
| 工具 | 特点 |
|---|
| delta | 给 git diff / diff 加上语法高亮的"颜值担当" |
| meld | GUI 三向对比,做合并很爽 |
| difftastic | 基于语法树的 diff,对代码尤其友好 |
| icdiff | 终端版彩色并排对比 |
git diff | deltaicdiff old.conf new.conf
四、sort —— 排序大师
排序是日志分析的第一步。
4.1 常用选项
| 选项 | 含义 |
|---|
-n | 按数字排序(默认按字符串) |
-r | 逆序(大→小) |
-k N | 按第 N 列 |
-t 'X' | 指定分隔符(默认空白) |
-u | 排序并去重 |
-h | human,识别 1K / 2M / 3G(看 du -h 输出救命) |
-V | 版本号排序(v1.2.10 > v1.2.9 ★) |
-R | 随机洗牌 |
--parallel=N | 并行加速 |
4.2 经典坑:默认按字符串排序
echo -e "100\n9\n23" | sort# 100# 23# 9 ← 字符串比较:'1' < '2' < '9'echo -e "100\n9\n23" | sort -n# 9# 23# 100 ← 加 -n 才是数字排序
4.3 案例:取出 /etc/ 下最大的 5 个文件
# 方法 1:对第 5 列逆序,取前 5ls -l /etc/ | sort -rnk5 | head -5# 方法 2:升序,取后 5ls -l /etc/ | sort -nk5 | tail -5# 方法 3:人类可读 + 一行更直观du -sh /etc/* 2>/dev/null | sort -rh | head -5
4.4 指定分隔符 —— 对 passwd 的 UID 列排序
# 拷贝一份做演示cp /etc/passwd /tmp/passwd-demo# /etc/passwd 用 ':' 分隔,按第 3 列(UID)逆序sort -t ':' -rnk3 /tmp/passwd-demo | head
4.5 多列排序
# 先按第 2 列升序,第 2 列相同再按第 4 列升序sort -k2, 2 -k4, 4n data.txt
⚠️ 严谨写法是 -k2,2(明确"只看第 2 列"),不写 ,N 会一路比到行尾,容易踩坑。
五、uniq —— 去重 + 统计
uniq 只能合并相邻重复行,所以几乎永远先 sort 后 uniq。
5.1 常用选项
| 选项 | 含义 |
|---|
-c | 去重并统计每行出现次数(★ 神器) |
-d | 只显示有重复的行 |
-u | 只显示没有重复的行(唯一行) |
-i | 忽略大小写 |
-f N | 跳过前 N 列再比较 |
5.2 经典套路 sort | uniq -c | sort -rn | head
运维 Top N 永恒公式,背下来就能装一辈子。
# Nginx access.log Top 10 客户端 IPawk '{print $1}' access.log | sort | uniq -c | sort -rn | head -10# Top 10 被访问 URLawk '{print $7}' access.log | sort | uniq -c | sort -rn | head -10# HTTP 状态码分布awk '{print $9}' access.log | sort | uniq -c | sort -rn# 当天每小时请求量awk '{print substr($4,2,14)}' access.log | sort | uniq -c5.3 找出文件里有几个重复行
sort data.txt | uniq -d# 只列出有重复的sort data.txt | uniq -d | wc -l# 重复行的种类数
六、管道 | —— 把命令"串起来"
这 5 把刀的"灵魂"就是管道:
命令1 | 命令2 | 命令3└──────┘ └──────┘ 把前一个命令的标准输出,喂给后一个命令的标准输入
6.1 经典组合拳(背下来直接抄)
# 1) 谁在暴力破解 SSH —— Top 10 失败 IPgrep "Failed password" /var/log/secure \ | awk '{print $(NF-3)}' \ | sort | uniq -c | sort -rn | head -10# 2) 当前最占内存的 10 个进程ps aux --sort=-%mem | head -11# 3) 哪个目录大 —— /var 下 Top 10du -sh /var/* 2>/dev/null | sort -rh | head -10# 4) 当前 TCP 连接状态分布ss -tan | awk 'NR>1 {print $1}' | sort | uniq -c | sort -rn# 5) 日志里出现频率 Top 10 的关键字awk '{for(i=1;i<=NF;i++) print $i}' app.log \ | sort | uniq -c | sort-rn | head -10学会这个套路 → 不会写脚本也能做半个数据分析师。
七、配套小工具:tee / xargs / column
虽然原文没提,但和上面这些命令组合极频繁:
# tee —— 一边看一边存ps aux | sort -rnk4 | head | tee top-mem.txt# xargs —— 把标准输入变成命令参数find . -name "*.log" -mtime+30 | xargs rm-f# column —— 自动对齐表格输出,看 sort | uniq -c 更舒服mount | column -t
八、避坑清单
✅ 数字排序必加 -n,字符串排序不会按 100 > 9
✅ uniq 之前永远先 sort,否则结果会缺
✅ which 不一定准,别名 / 内置 / 函数请用 type
✅ diff 看不懂的时候上 diff -u 或 vimdiff
⚠️ sort -k2 会一路比到行尾,需要精确请写 -k2,2
⚠️ 大文件排序记得加 --parallel=N,并用 -T /data/tmp 指向大盘做临时目录
⚠️ wc -l 数行靠 \n,最后一行没换行会少 1 行,谨慎用于校验
十、一句话总结
wc 数行、which/type 找命令、diff/vimdiff 对配置、sort+uniq+管道做 Top N。这 5 个加 1 个管道 |,就是运维分析日志的"半壁江山"。
如果对你有帮助,欢迎点赞 / 在看 / 转发给身边正在学 Linux 的小伙伴 👨💻