先纠正一个常见的误区:能用好 Linux 的人,往往不是背命令最多的人,而是知道某个场景下该用哪条命令、怎么把命令拼起来的人。网上"50+ Essential Linux Commands"这类标题我见过不少,但大多数停留在"命令+参数"的字典式罗列,看完除了收藏,真正上手时还是没头绪。这篇东西我想换一种讲法:仍然覆盖 50 条以上高频命令,但按真实使用场景分类,每条都告诉你它解决的痛点、常用参数背后的原理,以及我实际踩过的坑。适合刚入门 Linux 的开发者、运维新人,也适合那些想从"会敲命令"升级到"会用命令干活"的朋友。
我的习惯是把命令分成几个大块:文件与目录、文本处理、权限与用户、进程与监控、网络与远程、压缩与安装、组合技巧。每个大块下面再挑重点命令讲透,而不是平均用力。这样一份清单既是你查漏补缺的索引,也是真正能上手操作的参考。先给一张总览表,后面逐块展开。
| 类别 | 核心命令 | 主要用途 |
|---|---|---|
| 定位导航 | pwd, cd, ls, tree, find, locate, which, type | 查看当前位置、浏览目录、查找文件 |
| 文件操作 | touch, mkdir, cp, mv, rm, ln, file, stat | 创建、复制、移动、删除、链接、查看文件信息 |
| 文本查看 | cat, tac, head, tail, less, more | 查看文件内容、实时跟踪日志 |
| 文本处理 | grep, sed, awk, sort, uniq, wc, cut, tr, diff, paste | 搜索、替换、提取字段、统计、排序去重 |
| 权限与用户 | chmod, chown, chgrp, umask, id, whoami, su, sudo, passwd, useradd, usermod, userdel | 权限管理、用户管理、身份切换 |
| 进程系统 | ps, top, pgrep, kill, killall, pkill, jobs, fg, bg, nohup, watch, free, uptime, uname | 查看与调度进程、系统资源监控 |
| 磁盘存储 | df, du, mount, lsblk | 磁盘空间、目录容量、块设备查看 |
| 网络工具 | ping, curl, wget, ssh, scp, rsync, ss, netstat, ip, hostname | 连通性检查、数据下载、远程登录、文件同步、端口排查 |
| 压缩归档 | tar, gzip, gunzip, bzip2, xz, zip, unzip | 打包、压缩与解压 |
| 软件服务 | apt, dnf, systemctl | 软件安装更新、系统服务管理 |
| 提效技巧 | alias, history, echo, date, cal | 别名、历史记录、输出打印 |
上面这张表里已经超过 60 条命令,足够覆盖日常 95% 的操作场景。接下来我按照自己实际干活的经验,把这几个块逐个拆开讲。
1. 这份清单不是让你背的:命令的价值在组合里
我第一次学 Linux 时也走过弯路:买了本命令大全,从 a 到 z 挨个背参数,结果真正到了排查问题的时候,脑子里一片空白。后来一位前辈点醒我——命令就像螺丝刀,你不需要记住每一种型号的螺丝刀,你只需要知道"要拧螺丝了,去工具架上拿能用的一把",然后在反复使用中形成手感。
所以这篇清单的编排逻辑是"场景优先"。我不会把 50 条命令平均分配,而是按真实工作流的出现频率取舍。文件与目录操作几乎占每天操作的 40%,文本处理占 30%,剩下的权限、进程、网络、压缩各占一点。优先级不同,讲解的深度也不同。
另外,Linux 命令真正的威力来自组合,而不是单条命令。一个典型的例子:
history | awk '{print $2}' | sort | uniq -c | sort -rn | head -10这条组合命令能统计你最常敲的 10 条命令,用来复盘自己的工作习惯。单看 history、awk、sort、uniq、head 都很简单,但拼在一起就变成了一个实用小工具。我会在第 8 部分专门讲组合的思路,因为这才是"会用"和"看过"的分水岭。
还有一点想提前说明:不同发行版的命令细节可能有差异。本文以 Ubuntu/Debian 系的习惯为主,但 CentOS/RHEL 系遇到差异时我会单独标注,比如包管理部分是 apt 还是 dnf。原理层面所有发行版一致,参数细节用man 命令查永远是最靠谱的。
2. 文件与目录:每天最高频的二十几个基础命令
2.1 定位与导航:先搞清楚自己在哪里
打开终端第一件事通常是pwd,查看当前工作目录的绝对路径。这命令没啥技术含量,但当你在多层目录里绕晕时,它就是指南针。cd后面可以跟绝对路径或相对路径,cd -可以快速回到上一次所在目录,cd ~回到当前用户的家目录,这两招日常用得非常频繁。
ls大家都用,但我发现很多新手只会ls或者ls -l。实际最常用的是ls -la,a 显示包括隐藏文件在内的所有文件,l 显示详细属性(权限、属主、大小、时间)。隐藏文件不是秘密文件,它们只是名字以.开头,默认不显示而已。配置文件大多藏在这里,比如当前用户的环境变量文件.bashrc。
找文件时,find是最稳的:
find /var/log -name "*.log" -mtime +7这条命令在 /var/log 下查找名字以 .log 结尾、且修改时间超过 7 天的文件。-name支持通配符,-type f只找文件、-type d只找目录,-mtime按修改时间过滤。find之所以常用,不只是因为能按名字找,而是它可以作为批处理入口:find ... -exec rm {} \;可以把搜索结果直接交给后续命令处理。虽然现在我会优先用fd这类更快的替代工具,但在存量服务器上,find依然是普适性最强的。
locate比find快得多,因为它查的是预建的数据库。代价是数据库不是实时更新,新创建的文件可能查不到,需要先跑一次sudo updatedb。所以我的经验是:临时快速找文件用 locate,需要精确条件且要求结果实时准确时用 find。which和type用来定位命令本身的可执行文件路径,排查"我明明装了软件为什么敲命令提示找不到"这类问题时非常有用。
2.2 创建、复制、移动与删除:每个参数背后都有代价
touch不只是创建空文件,它真正的用途是修改文件时间戳。有时候编译系统会因为时间戳错乱而重新编译一堆本不需要编译的文件,用touch把时间统一改一下就解决了。mkdir -p a/b/c可以递归创建多级目录,-p这个参数我几乎每次都用,因为先建父目录再建子目录 step by step 太不合理了。
cp复制文件时,新手最容易犯的错是两个目录复制搞混递归参数。cp -r递归复制目录,cp -a相当于-r加上保留属性(权限、时间戳、链接)。我备份配置目录时习惯用cp -a,保证复制出来的文件属性跟原文件完全一致,避免因为权限变化导致服务起不来。mv移动文件,表面上是"移动",实际在同一文件系统内只是改了个目录项,速度极快;跨文件系统移动则变成"复制+删除",大文件时会有明显等待。
rm是 Linux 世界里最需要敬畏的命令之一。rm -rf中的 r 是递归删除目录,f 是强制删除不提示。这两个参数组合在一起,配合绝对路径手滑一下,后果可能是毁灭性的。我见过某运维同事原本想删临时目录,结果命令写成了rm -rf /var /tmp这种带有空格的写法,系统直接崩了大半。我的建议很朴素:交互式删除时正确使用通配符,删重要目录之前先用ls确认一次路径;更稳妥的做法是给rm设置别名alias rm='rm -i',让它每次删除都问一句。
ln -s 目标 链接名创建软链接(符号链接),相当于 Windows 里的快捷方式。软链接可以跨文件系统,也可以指向目录;硬链接则不行,它只能在同一个文件系统里指向文件的真实数据块。日常使用中软链接最常见,比如把日志目录链接到一个更大磁盘的路径下。判断一个文件是不是软链接,ls -la里文件名旁边的箭头就是答案。
2.3 文件信息与磁盘占用:眼见为实的排查手段
file命令用来识别文件真实类型。扩展名会说谎,但文件头不会。下载了一个没有扩展名的文件,先file xxx,看到gzip compressed data就知道该用tar还是直接file判断是否正确。stat能显示文件的完整时间线:访问时间、修改时间、状态变更时间,排查"这个文件到底什么时候被动过"时特别好用。
磁盘容量类的问题,df和du是最佳组合。df -h看整个文件系统的使用率,h 参数把容量转成人类可读的 G/M;du -sh *看当前目录下每一项占了多少空间。服务器磁盘告警时,标准操作是先df -h确认哪个分区满了,再du -sh /var/*逐级定位大文件。这个看起来简单的组合,每次都能救我于水火。
tree不是系统自带的,但装完之后你会离不开它:以树状结构展示目录层级,tree -L 2限定深度避免输出刷屏。理解目录结构时直观程度远超ls -R。
3. 文本处理:读文件、搜内容、批量改配置
3.1 查看文件:从 cat 到 less 的进化路线
cat适合看小文件,直接输出全部内容到终端。tac是它的反写,按行倒序输出,偶尔看日志尾部时比较方便,但实际用得不多。head -n 20看文件开头 20 行,tail -n 20看文件结尾 20 行,tail -f则进入实时跟踪模式,日志文件有新写入就立刻打印,这是排查在线问题的第一利器。
大文件千万别用cat,一个 2GB 的日志直接刷屏,终端都要卡死。用less最合适:less app.log进入分页浏览,按/输入关键词搜索,按n跳到下一个匹配项,按g回到开头,按G跳到结尾,按 q 退出。less 打开大文件很快,因为它不会一次性把整个文件塞进内存,而是按需读取。同样的文件,cat 和 less 的体验差距是"卡死"和"顺滑"的区别。
3.2 搜索内容:grep 是日志排障的核心工具
grep按行匹配文本,是我使用频率最高的一条命令。基础用法是grep 关键词 文件,但实际场景几乎都会加参数:
grep -rn "timeout" /etc/nginx/-r递归搜索目录下所有文件,-n显示匹配行号。-i忽略大小写,-v反向匹配(排除某些行),-l只显示包含匹配内容的文件名而不是具体行,-c统计匹配行数。排查日志时我最常用的组合是grep ERROR app.log | head -50,先看看错误的大致样子,而不是让几千行错误一次性刷满屏幕。
grep 的正则能力也值得花时间掌握。基础正则里,^匹配行首,$匹配行尾,.匹配任意字符,*表示前一个字符重复任意次。比如grep '^2024-.*ERROR' app.log能找出所有 2024 年开头的 ERROR 日志行。注意 grep 默认是基础正则,+和?这类扩展正则要用grep -E,或者用egrep。正则表达式是文本处理的基石,不是一门可以绕开的课,值得专门花一两周练习。
3.3 批量改文件:sed 与 awk 的双剑合璧
sed是流编辑器,核心用途是批量替换文本。
sed -i.bak 's/old_string/new_string/g' app.conf-i直接修改文件,.bak表示修改前先备份为 app.conf.bak。我强烈建议第一次用 sed 处理重要配置时都带备份后缀,改错了还能救回来。s是替换命令,g是全局替换(每一行的所有匹配而非第一个匹配)。分隔符不一定非要用/,替换内容里含斜杠时可以用#代替,比如sed 's#/var/log#/data/log#g',这样就不用转义斜杠了。
awk则擅长按列处理文本,默认按空白符切分每一行:
awk '{print $1, $9}' access.log打印访问日志的第一列(IP)和第九列(请求状态码)。它的完整写法是"条件 + 动作":awk '$9 == 404 {print $1, $9}' access.log只输出 404 请求的 IP 和状态码。awk 的能力远不止这些,它有自己的变量、循环和函数,很多运维直接拿它写小型数据处理程序。但在日常里,掌握"按列取数"和"条件过滤"这两招,就已经能解决八成需求。
这里插一句:sed 和 awk 学起来确实有门槛,我建议不要死记语法,而是工作中遇到真实需求(比如批量替换配置里的 IP、统计日志里某个字段的分布)时现查现用,用着用着就熟练了。
3.4 排序、去重、统计与比较
日志分析里最经典的组合是排序去重统计。
grep "GET" access.log | awk '{print $1}' | sort | uniq -c | sort -rnsort排序,uniq -c对相邻重复行进行去重并统计次数(注意 uniq 只处理相邻行,所以必须先 sort),最后的sort -rn按数字倒序排列。这条链式命令能快速得出"访问量最大的 IP 是哪些"。wc -l统计行数,wc -c统计字节数,验证日志是否完整时经常用到。
cut按分隔符切列,和 awk 有点像,但更轻量:cut -d',' -f2 data.csv按逗号切分取第二列。tr做字符级替换或删除,比如把文件里的逗号全换成制表符:tr ',' '\t' < input.txt,注意它和 sed 的定位不同:tr 处理单个字符映射,sed 处理更复杂的模式。diff对比两个文件的差异,diff -u old.conf new.conf输出标准 diff 格式,排查配置改动时非常直观。paste可以把两个文件按行拼接,和cat的按列拼接形成对照——cat 是把文件内容竖着串起来,paste 是把内容横着并排放。
4. 权限、用户与安全:搞清楚谁能动什么
4.1 权限模型与三件套:chmod、chown、umask
Linux 的权限模型一句话总结:每个文件有一个属主、一个属组、以及其他用户三类身份,每类身份分别有读 r、写 w、执行 x 三种权限。chmod 754 file中的数字表示法,就是把权限转成二进制再算十进制:7=rwx(4+2+1),5=r-x(4+1),4=r--。所以 754 表示属主完全控制、属组可读可执行、其他人只读。
理解数字权限的由来比死记数字更重要。比如 6 是 4+2,代表可读可写但不可执行;3 是 2+1,代表可写可执行但不可读,这在目录权限上很常见。目录的执行权限含义和文件不一样——目录的 x 权限决定了你是否能进入该目录,所以一个目录如果是rw-,你看得到名字但进不去,这在 NFS 挂载目录时经常让人困惑。
chown user:group file修改属主和属组,排查"明明有权限却写不进去"问题时先看一眼属主是不是自己。chgrp单独改属组,实际我都是直接用 chown 一次搞定。umask决定新建文件的默认权限,它是个掩码:umask 022表示默认给文件 666-022=644 权限、给目录 777-022=755 权限。这个机制理解起来有点绕,简单记:umask 值越大,新文件权限越保守。服务器上如果涉及多用户协同,umask 设成 027 更安全,避免同组用户之外的人读到文件。
4.2 用户管理:加人、删人、切身份
多用户系统上,用户管理是基本功。useradd创建用户(Debian 系推荐adduser,它会顺带创建家目录并生成交互式配置),usermod -aG sudo username把用户加入 sudo 组,userdel -r username删除用户连同家目录。passwd修改当前用户的密码,管理员可以passwd username重置其他用户密码。id查看当前用户的所有身份信息(uid、gid、所属组),排查权限问题时第一件事就是id,看看当前身份是不是你以为的那个身份。
身份切换是日常操作最多的环节。whoami查看当前用户名,su - username切换用户(注意-会同时加载目标用户的环境变量,不加则保留当前环境,这俩效果差别很大),sudo 命令则是在当前用户基础上临时提升权限执行单条命令。我的安全习惯是:能用 sudo 就不要 su root,因为 sudo 会记录操作日志,出了问题知道是谁干的;长时间保持 root 终端很容易在错误目录里执行破坏性命令。
5. 进程与监控:把系统的脉搏握在手里
5.1 进程查看:ps、top 与信号控制
ps aux是查看进程状态的标配,a 显示所有用户的进程,u 显示用户和资源占用,x 显示没有控制终端的进程。输出里的 STAT 一列代表进程状态:S 睡眠、R 运行、Z 僵尸等。看到 Z 时别急着慌,它通常意味着父进程还没回收子进程的退出状态,配合ppid找到父进程排查。
top提供实时刷新视图,按 P 按 CPU 排序,按 M 按内存排序,按 q 退出。htop是 top 的增强版,有树形进程视图,可以直接用 F9 菜单发送信号,体验好很多,但需要额外安装。排查"谁的 CPU 飙高"时,我一般先top看一眼,再ps aux --sort=-%cpu | head -10精确定位排序前几名的进程。
信号机制是进程控制的底层逻辑。kill -15 PID发送 TERM 信号,相当于礼貌地请进程自行退出;kill -9 PID发送 KILL 信号,内核直接强制结束进程。能先kill -15就别急着kill -9,因为很多进程需要在退出前保存状态或清理临时文件,强制杀死可能留下脏数据。pkill 名字按进程名发信号,killall 名字也一样,适合同名进程批量处理。发信号之前一定先用pgrep -l 名字确认你找的是不是目标进程,我见过把主进程 pkill 之后整个服务直接挂掉的场面。
5.2 后台与定时循环:让任务不占终端
在终端里敲一条长时间运行的命令,比如打包一个 100GB 的目录,它会一直占用你的 shell。把任务放到后台让终端继续干活,这是运维的基本操作。命令后面加&放入后台,jobs查看当前 shell 的后台任务列表,fg %1把编号 1 的后台任务调回前台,bg %1把一个暂停的任务在后台继续跑。Ctrl+Z是暂停前台任务并放回后台的快捷键,很多人不知道它。
但&有个致命问题:shell 退出时后台任务会收到挂断信号而终止。想让任务在终端关闭后继续跑,标准做法是nohup:
nohup python3 app.py > app.log 2>&1 &nohup 让进程忽略挂断信号,> app.log把标准输出重定向到日志文件,2>&1把标准错误也合并进去,最后的 & 放后台。这个写法我几乎每周都用,不把日志重定向的话进程一报错你就完全不知道发生了什么。2>&1的顺序也有讲究,必须写在> 文件后面,反了会导致标准错误没有重定向成功。
watch命令适合周期性观察某个输出,默认每 2 秒刷新一次,不会加剧终端负担但也足够覆盖多数动态场景,比如断点续传下载的状态或服务进程数变化:
watch -n 1 'ps aux | grep nginx | grep -v grep | wc -l'这比一遍遍手动敲命令观察输出效率高很多。
5.3 系统资源与硬件信息:一张体检报告
free -h看内存使用,关键要看 available 而不是 used,因为 Linux 会把空闲内存拿来做缓存,used 看着高其实不必慌张。uptime显示系统运行时间、登录用户数和最近 1/5/15 分钟的平均负载,负载数字高于 CPU 核数通常说明排队严重。uname -a查看内核版本,排查驱动或系统兼容性问题时必用。lscpu查看 CPU 架构、核数、频率;lsblk以树形展示磁盘分区结构,比直接看/proc/partitions直观;lspci看 PCI 设备(比如 GPU),lsusb看 USB 设备。这些命令都是只读的,多多益善,每次系统体检我都会统一跑一遍看基本信息。
6. 网络与远程管理:从连不通到找得到
6.1 连通性检查:ping、curl 与 wget
ping是最基本的连通性工具,发 ICMP 包并统计响应时间。ping -c 4 domain.com指定发送次数而不是无限 ping,TTL 字段也能反映目标距离,但注意很多公网服务器禁 ping,超时不代表服务不可用,要配合端口检查一起判断。
curl是调试 HTTP/HTTPS 的瑞士军刀,不是只能用来下载。curl -I https://example.com只看响应头,返回 200 说明站点正常;curl -v https://example.com显示完整请求和响应过程,包括 TLS 握手细节,排查证书问题很好用;curl -o 保存的文件名下载文件,-L跟随重定向。接口调试时我还会加-H自定义 Header、-dPOST 数据。wget 同样用于下载,优势是递归下载和断点续传:wget -c断点续传下载大文件时比 curl 顺手,这两个互为补充,不必非分高下。
6.2 远程登录与文件传输:ssh、scp 与 rsync
ssh user@host登录远程服务器,加了-p 2222指定非默认端口。密钥登录比密码登录更安全也更省事:本地生成密钥对后用ssh-copy-id user@host把公钥推送到远程,之后每次登录不再输密码。这个操作属于基础安全加固动作。scp基于 ssh 做文件复制:scp file user@host:/remote/path/推文件,反向拉取把远程路径放前面本地路径放后面。
rsync才是我日常同步文件的主力。它的增量同步算法只传输差异部分,大目录同步比 scp 全量复制快出几个量级。最常用的是归档模式:
rsync -avz /local/dir/ user@host:/remote/dir/-a归档模式保留权限时间戳等属性,-v显示过程,-z传输时压缩。注意源目录加不加末尾/结果完全不同:rsync -avz dir/ target/同步目录内容,rsync -avz dir target/则会在目标下多建一层同名目录。做镜像同步时会加--delete删除目标端多余文件,这参数等于目标端完全对齐源端,方向别搞反了,慎用。
6.3 端口与连接:ss、netstat 和 ip
排查"端口被占用"或者"服务为什么起不来"时,ss -tlnp是最该记的命令。-t显示 TCP 连接,-l只看监听端口,-n不做反解以数字显示端口,-p显示占用端口的进程名和 PID:
ss -tlnp | grep :8080一次就能看到到底哪个进程占着 8080。老系统上netstat -tlnp效果类似,但netstat默认没有预装在新发行版里,ss 是它的现代替代品。ip addr查看本机 IP 地址,ip link查看网卡状态,ip route查看路由表。这套命令正在逐步取代已经退役的 ifconfig。hostname查看主机名,服务器标准化管理时它直接决定你登录的是哪台机器,建议每台服务器都设置含义明确的主机名。
7. 打包压缩与软件安装:交付和部署的基本功
7.1 tar:归档工具的绝对主角
Linux 世界里,tar承担了打包+压缩的双重职责,它本身只做打包,压缩是调用 gzip 等外部程序完成的。最常用的四个组合:
tar -czvf name.tar.gz /path:打包并 gzip 压缩,c 创建、z gzip、v 显示过程、f 指定文件名tar -xzvf name.tar.gz:解压,x 解包tar -tzf name.tar.gz:只查看包内有什么文件,不解压tar -xzvf name.tar.gz -C /target/dir:解压到指定目录
这里f必须放在参数最后,因为-f后面要紧跟文件名,不带-f的话 tar 会从磁带设备读取,现在的机器上大概率直接报错。解压之前养成tar -tzf先看内容的习惯,避免一个压缩包解开几百个文件把当前目录搞得乱七八糟。另外tar -czvf这组选项的顺序不是固定的,tar -zcvf也可以,但新手我建议固定写czvf,少一个思考负担。
7.2 压缩格式选择:gzip、bzip2、xz 与 zip
不同压缩算法是省时间还是省空间,差别很大。我做了一个对比表:
| 命令 | 压缩率 | 速度 | 典型场景 |
|---|---|---|---|
| gzip(.gz) | 中等 | 快 | 日常打包、日志轮转,兼顾速度与体积 |
| bzip2(.bz2) | 较高 | 较慢 | 需要更高压缩率但不想等太久 |
| xz(.xz) | 最高 | 慢 | 软件源码包分发,压缩一次反复使用 |
| zip(.zip) | 低 | 快 | 需要与 Windows 用户交换文件时 |
单独压缩一个文件时gzip file.log会把原文件替换成 file.log.gz,gunzip或gzip -d解压恢复。日志轮转工具 logrotate 的压缩后端默认就是 gzip,因为速度优先。软件发布包用 xz 压缩率最高,分发时省带宽;但如果是一份每天都要更新的数据备份,xz 的压缩耗时你可能等不起,选 gzip 更合理。zip 和 unzip 在 Linux 上更多是处理来自其他系统的文件,格式化 U 盘或网盘下载的压缩包基本都是 zip,这时候unzip file.zip -d dir按目录解压。
7.3 软件安装与服务管理:apt、dnf 与 systemctl
Debian/Ubuntu 系的apt和 RHEL 系的dnf承担了软件包管理职责。apt update更新软件源索引,apt upgrade升级已安装软件,apt install 包名安装,apt remove 包名卸载。注意update只是更新本地索引,不实际升级软件,很多新手apt update完以为升级完成了。从源码编译安装依然是有效路径,比如没有现成软件包时,标准的套路是./configure && make && make install,但依赖处理靠系统包管理器会省心很多。若涉及 Python 环境,我会优先创建独立虚拟环境并在其中用 pyvenv 相关命令管理依赖,尽量避免把包装进系统目录引发版本冲突或污染系统环境。
服务管理上,现代发行版统一用systemctl。systemctl start nginx启动服务,systemctl enable nginx设置开机自启,systemctl status nginx查看运行状态和报错信息,systemctl restart nginx重启。排查服务问题时第一件事永远是systemctl status,它比看进程表更直接,会给出常见的失败原因或倒计时提示。
8. 把命令拼起来用:管道、别名与一次真实排障复盘
8.1 管道的核心思想:命令的输出就是下一条命令的输入
Linux 哲学的集大成者就是管道。|把左边命令的标准输出接给右边命令的标准输入,数据像流水线一样经过一道道工序。这个设计让单条命令的简单性变成整体的强大。看一个真实的分析案例:
cat access.log | awk '{print $1}' | sort | uniq -c | sort -rn | head -3顺序是:取出每行第一个字段(IP)→ 排序 → 统计重复次数 → 按次数倒序 → 取前三名。这就是一个完整的流量来源 Top3 分析任务。不用写脚本,一行命令就完成了。调试管道时有个技巧:如果结果不符合预期,从中间拆开看,先跑cat access.log | awk '{print $1}' | head验证第一段是否正确,再逐段往后加,不要一口吃个胖子。
重定向则让结果落地:>覆盖写入文件,>>追加到文件末尾。ls > list.txt与ls >> list.txt的结果差异,新手经常混淆,记住>是"清空并写入",>>是"从末尾追加"。如果只丢弃不需要的输出,>/dev/null是个黑洞,比如 cron 任务里不想收到垃圾邮件就把标准输出丢进去。
8.2 提效三件套:alias、history 与快捷键
alias给复杂命令起短名,是最高性价比的提效手段。我在所有机器上都会配置这几行:
alias ll='ls -lAh' alias la='ls -A' alias grep='grep --color=auto' alias rm='rm -i'写在~/.bashrc或~/.zshrc里,新终端自动生效。注意alias rm='rm -i'这条,它会让你每次删除前都确认一下,看似啰嗦,但比起事故后的追悔莫及,这个确认成本实在太划算了。alias不会覆盖原命令,想临时跳过别名用原命令,在命令前加\即可:\rm file。
history查看命令历史,history | grep ssh搜索以前用过的命令。按Ctrl+R进入反向增量搜索,边输入边匹配历史命令,是我每天用几十次的快捷键。!!代表上一条命令,sudo !!能以管理员权限重新执行上一次命令,这是个危险但高效的小技巧;!$代表上一命令的最后一个参数,比如mkdir config之后想进入目录,直接输cd !$就行。
8.3 一次真实排障复盘:从磁盘告警到定位元凶
拿一个我实际处理过的案例完整演示组合排查思路。某天监控告警:应用服务器磁盘使用率 95%。当时我按这套流程操作:
第一步,df -h确认哪个分区爆了。输出显示/var分区 95%,问题锁定在 /var 目录。第二步,cd /var后用sudo du -sh * | sort -rh | head -10列出各子目录占用大小降序前十个,du -sh *统计每一项大小,sort -rh按人类可读的数字逆序排列。结果发现/var/log占了 70% 空间。第三步,sudo du -sh /var/log/* | sort -rh | head继续逐级下钻,最后一个应用日志文件 aapp.log 占了几十 GB。第四步,用tail -n 50 aapp.log看最后几行内容,发现是一个循环任务在疯狂打印重复报错日志。第五步,先服务端修复问题,再sudo > aapp.log清空日志文件(用>以清空方式打开文件,而不是rm删除,因为进程还握着文件句柄,删了磁盘空间不释放),最后 df 确认磁盘回落到 40%。
整个过程没有用到任何冷门命令,全部是 df、du、sort、head、tail 这些基础命令的组合。这也是我想在这篇清单最后传递的核心观点:命令本身不神奇,神奇的是面对问题时,你脑子里能浮现出"该用哪条命令、下一步该看什么"的排查链路。把每个基础命令用熟,理解它们的输入输出,然后用管道有机地组合起来,你就能应付绝大多数日常运维和开发场景。这份超过 50 个命令的清单,最终的目的不是让你全部背下来,而是让你知道工具箱里有哪些工具,以及每种工具最适合的场景,等真正需要的时候,再回来翻对应章节就好。