当前位置:首页>Linux>Linux 运维 5 个"小而美"的命令:wc / which / whereis / diff / sort+uniq 一篇打包

Linux 运维 5 个"小而美"的命令:wc / which / whereis / diff / sort+uniq 一篇打包

  • 2026-10-11 07:11:05
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 常用选项

选项含义
-lline,行数(最常用 ★)
-wword,单词数
-cchar,字节数
-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

输出含义:

符号含义
aappend,新增
cchange,修改
ddelete,删除

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跳到下一个 / 上一个差异
dodiff obtain,把对面的内容拉过来
dpdiff put,把本边的内容推过去
:diffupdate重新计算差异
Ctrl+w w切换左右窗口
:qa!全部退出不保存

3.6 现代化替代品(强烈推荐试试)

工具特点
delta给 git diff / diff 加上语法高亮的"颜值担当"
meldGUI 三向对比,做合并很爽
difftastic基于语法树的 diff,对代码尤其友好
icdiff终端版彩色并排对比
git diff | deltaicdiff old.conf new.conf

四、sort —— 排序大师

排序是日志分析的第一步。

4.1 常用选项

选项含义
-n按数字排序(默认按字符串)
-r逆序(大→小)
-k N按第 N 列
-t 'X'指定分隔符(默认空白)
-u排序并去重
-hhuman,识别 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 -c

5.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

八、避坑清单

  1. ✅ 数字排序必加 -n,字符串排序不会按 100 > 9

  2. ✅ uniq 之前永远先 sort,否则结果会缺

  3. ✅ which 不一定准,别名 / 内置 / 函数请用 type

  4. ✅ diff 看不懂的时候上 diff -u 或 vimdiff

  5. ⚠️ sort -k2 会一路比到行尾,需要精确请写 -k2,2

  6. ⚠️ 大文件排序记得加 --parallel=N,并用 -T /data/tmp 指向大盘做临时目录

  7. ⚠️ wc -l 数行靠 \n,最后一行没换行会少 1 行,谨慎用于校验

十、一句话总结

wc 数行、which/type 找命令、diff/vimdiff 对配置、sort+uniq+管道做 Top N。这 5 个加 1 个管道 |,就是运维分析日志的"半壁江山"。

如果对你有帮助,欢迎点赞 / 在看 / 转发给身边正在学 Linux 的小伙伴 👨‍💻

最新文章

随机文章