说实话,这年头谁电脑里没存过几张“Linux 常用命令大全”的截图?我自己从刚入行那会儿就开始收集这类速查表,手机上存过、书签里收藏过、笔记软件里记过。后来发现一个问题:收藏从不等于掌握。速查表真正的作用不是让你背下来,而是在关键时刻替你省下翻文档的那几分钟,尤其是线上出故障、领导站在背后、业务方在群里连环催的时候。
今天分享的这份分类速查表,是我这几年把它当成“桌面工具”用的版本。它不是教科书式的命令罗列,而是按日常干活的实际场景来分类——文件操作、日志排查、网络诊断、容器管理、面试突击,每一类都配了使用场景和常见的坑。无论你是刚接触 Linux 的新手,还是想系统梳理一遍命令体系的运维、开发,这篇文章应该都能让你有点收获。
1. 速查表不是背出来的:先搞懂命令的本质
1.1 命令只是工具,不是知识
我见过太多人学 Linux 命令的方式:买了一本六七百页的《Linux 命令大全》,从第一页开始背,背到ls的十七种参数就放弃了。这是典型的把工具当知识在学,方向完全反了。
命令的本质是工具,就像螺丝刀和扳手,你不需要背下每种螺丝刀的型号,你只需要知道“拧十字螺丝用十字头,拧内六角用内六角扳手”,然后在你真的需要拧螺丝的时候,知道去哪把找那把对的工具。Linux 命令也一样,ls、cd、cat这些高频命令用几次就肌肉记忆了;traceroute、iostat这种低频命令,你只需要知道“排查网络延迟用它”“排查磁盘 IO 用它”,到了现场再man一下或者查下速查表就行。
所以这份速查表的第一个设计原则是:按场景分类,不按字母排序。字母排序适合字典,不适合干活。真正干活的时候,你的脑子里想的是“我要看日志的最新内容”,而不是“我要找一个 L 开头的命令”。
1.2 我推荐的三层分类法
用了这么多年,我把 Linux 命令分成三层,对应不同的使用频率和掌握程度:
- 第一层:肌肉层命令。每天都要敲的,比如
ls、cd、cat、grep、ps、df。这类命令不需要看速查表,敲多了自然熟,目标是形成肌肉记忆。 - 第二层:场景层命令。平时用不到,但一到特定场景就特别重要,比如排查网络时的
traceroute、分析磁盘 IO 的iostat、批量改文本的sed。这类命令适合做成速查表,用时快速定位。 - 第三层:专家层命令。比如
gdb调试、perf性能分析、strace系统调用跟踪。这类命令有很高的学习曲线,用之前需要先了解背景知识,速查表只能起到“提词器”的作用。
你只需要把第一层练熟,第二层做好索引,第三层知道有这个东西且能看懂基本输出就行。下面我按这个思路,把常用命令分类展开。
2. 文件与文本处理:每天敲得最多的命令族
2.1 文件查看:从 cat 到 tail -f 的进化
很多人对文件查看的理解停留在cat,cat确实能把整个文件内容怼到屏幕上,但它有两个问题:一是文件一大,终端刷屏刷到你怀疑人生;二是你根本没法定位到想看的位置。所以我的建议是:小文件用cat,大文件用less,跟踪日志用tail -f。
less是我最推荐的文件查看工具,它支持上下翻页、搜索关键字、跳转到指定行。打开一个几百 MB 的日志文件,less秒开,cat能把终端卡死。常用的操作:/关键字往下搜,?关键字往上搜,g跳到文件头,G跳到文件尾,q退出。这几个键记住,基本就可以扔掉cat了。
tail -f是排查日志的利器,-f的意思是 follow,实时跟踪文件末尾新增的内容。当你在排线上 bug,需要盯着日志看输出时,tail -f app.log就是你的主战场。如果只想看最后 100 行,tail -100 app.log。反过来,如果文件不大但想看开头部分,head -50 app.log。
这里插一个我踩过的坑:用tail -f看日志,终端挂着不动,你以为程序挂了,其实是因为日志写得太慢,或者你打开的日志文件根本没有新内容写入。这时候先确认文件有没有在增长,用ls -l看文件大小,或者加个-n 0参数直接从当前尾部开始跟踪。
2.2 搜索与统计:grep、find、awk 的组合玩法
grep是 Linux 里使用率前三的命令,它的核心功能是在文件内容里搜关键字,但很多人只会grep xxx file。实际工作中,我几乎总是搭配参数使用:
grep -i keyword file:忽略大小写,搜日志的时候尤其有用,因为你不知道应用是输出Error还是ERROR。grep -v keyword file:反向匹配,过滤掉含关键字的行,相当于“排除法”。grep -n keyword file:显示行号,定位到具体的位置,方便去源码里查。grep -r keyword /path/to/dir:递归搜索整个目录,适合在项目代码里找关键字。grep -c keyword file:统计匹配的行数,不显示内容,适合统计错误数量。比如排查接口报错,直接grep -c "Exception" app.log看有多少次异常。
find是另一个高频命令,它是按文件名、大小、时间等条件在目录树里找文件。比如:
find / -name "nginx.conf" 2>/dev/null:全局找文件名,2>/dev/null把权限报错丢进黑洞。find /data -mtime -3:查找最近 3 天内修改过的文件,排查“谁动了我的服务器”时很有用。find /data -type f -size +100M:找大于 100MB 的文件,清理磁盘时必备。
至于awk,这是一个能让你从“会 Linux”进阶到“懂文本处理”的命令。它的核心是按列处理文本。比如日志格式是“时间 IP 状态码 耗时”,你想提取所有耗时超过 3 秒的请求 IP,一条awk就能搞定。我常用的是awk '{print $1, $4}'这种提取列的用法,配合sort | uniq -c还能做简单的统计排序。不过awk的语法需要单独学习,速查表里先记住两个最常用的:awk '{print $N}'取第 N 列,awk -F',' '{print $1}'指定分隔符取列。
2.3 修改与编辑:sed 和 vim 的实用片段
如果有人问我,服务器上改文件用什么,我的答案是sed。sed是流编辑器,非常适合做批量的、非交互式的文本替换。比如:
sed -i 's/old_string/new_string/g' config.conf这条命令把config.conf里所有old_string替换成new_string,-i表示直接修改文件,g表示全局替换。这在批量改配置文件时是救命稻草。比如你有 10 台服务器,要统一把 Redis 密码从oldpass改成newpass,用sed -i配合一个循环脚本,几分钟就能搞定。
vim则适合交互式编辑。我理解很多人一进vim就手足无措,只记住两个模式:按i进入编辑模式,按Esc退出编辑模式,然后输入:wq保存退出。再记一个:q!强制不保存退出,这基本就能活下来了。如果非要再记一个,dd可以删除整行,在vim里修改配置时非常好用。
提示:
sed -i是直接改文件的,执行前建议先备份。我习惯写成sed -i.bak 's/xxx/yyy/g' file,这样会自动生成一个file.bak备份文件。线上配置改坏了,还能一秒回滚。
3. 运维排查六板斧:日志、进程、网络、磁盘一次说清
3.1 日志定位:tail、less、journalctl 怎么配合
排查线上问题,第一步永远是看日志。我的固定套路是:
- 先确认日志文件在哪。应用自己定义的,一般在
/var/log/下或者应用目录的logs/文件夹;systemd 管理的服务,用journalctl -u 服务名。 tail -n 100 app.log看最近报错。- 如果报错信息不够完整,用
grep -n "Exception" app.log | head定位最早出现异常的位置,再sed -n '1200,1220p' app.log看指定行区间的上下文。
比如你用journalctl查一个服务:
journalctl -u nginx --since today --until "2024-01-01 12:00:00"这就是查 systemd 管理的 nginx 服务今天的日志。在看不到日志文件路径的 CentOS 7+ 系统里,这个命令是绕不开的。
3.2 进程与负载:ps、top、htop 的快速判断
“机器卡了”是运维接收到最多的反馈,但“卡”是一个模糊描述,有可能是 CPU 满、内存不足、磁盘 IO 瓶颈,甚至网络带宽打满。我的排查顺序是:先top看整体负载,再ps看具体进程。
top默认每 3 秒刷新一次,按P按 CPU 排序,按M按内存排序。第一眼要看的三个数:load average(1、5、15 分钟的平均负载)、%Cpu(s)里us(用户态)和wa(等待 IO)的占比、KiB Mem里 available 是否远小于 total。如果 load average 超过 CPU 核数,说明系统在排队,大概率有进程在打满资源。此时按P让 CPU 占用率最高的进程排到最上面,记下 PID,再用ps aux | grep PID看这个进程的详细信息,包括启动命令、所属用户、启动时间。
htop是top的增强版,有颜色、可点击、支持树状视图,但很多精简版系统默认没装。我的习惯是:先top快速判断,再htop深入分析。如果你有台机器没装htop,top也完全可以胜任 80% 的排查场景。
3.3 网络与端口:netstat、ss、curl 排障实录
“服务起不来”“端口不通”“访问超时”,这类问题靠网络排查命令解决。我常用的三件套是ss、curl、ping。
ss是netstat的替代品,输出更快更清晰。查某个端口是否在监听:
ss -lntp | grep 8080-l只显示监听状态的端口-n不解析域名和用户名,显示数字-t只显示 TCP 连接-p显示进程信息
如果你发现端口没监听,说明服务可能挂了;如果端口是LISTEN状态但你仍然连不上,那就要考虑防火墙了。CentOS 7+ 检查防火墙用firewall-cmd --list-all,Ubuntu 用ufw status。
curl是我测试 HTTP 接口最常用的工具,它能模拟请求并返回响应:
curl -I http://localhost:8080 curl -v http://localhost:8080/api/health-I只显示响应头,-v显示详细过程,包括 DNS 解析、TCP 连接、TLS 握手、请求头和响应体。当你需要排查“为什么请求失败”,curl -v能告诉你卡在哪一步:DNS 解析失败、连接被拒、超时、还是 TLS 证书有问题。
3.4 磁盘与存储:df、du、lsblk 的容量排查
磁盘满是个经典故障,表现是服务突然写不了日志、数据库报错“no space left on device”。排查命令很简单:df -h看文件系统使用率,du -sh看某个目录占了多少空间。
df -h du -sh /var/log/*df -h输出里你会看到若干行,找到挂载点/的那一行,Use% 接近 100% 就是根分区满了。接下来用du -sh /var/log/*找一下是哪个子目录占了大头,比如发现messages日志文件已经 20GB,那就确认是日志没做轮转,直接处理。
lsblk则是看磁盘分区的命令,输出很直观,能看清整块磁盘分成几个分区、挂载到哪个目录。当你新插入一块磁盘,想确认系统有没有识别到,第一件事就是lsblk。
注意:清理磁盘时不要直接
rm正在被进程占用的日志文件,比如rm /var/log/messages之后,磁盘空间可能不会立刻释放,因为进程还握着这个文件的句柄。正确做法是> /var/log/messages清空文件内容,或者kill -HUP 进程PID让进程重新打开日志文件。这个坑我踩过,当时以为删完了,结果df一看一点没变。
4. 高速工作流:传输、压缩、包管理与 Git
4.1 服务器间传输:scp、rsync 怎么选
两台服务器之间传文件,最朴素的方式是scp,语法和cp几乎一样:
scp /local/file.txt user@192.168.1.10:/remote/path/ scp -r /local/dir user@192.168.1.10:/remote/path/-r递归传目录。scp走 SSH 协议,所以确保两边 SSH 是通的。但scp有个缺点:全量传输,文件大了就很慢,而且传了一半断了没有断点续传。
如果你要同步大量文件、或者做定时备份,用rsync更合适。rsync支持增量同步,只传差异部分,还支持断点续传和压缩。我的常用写法:
rsync -avz --progress /local/dir/ user@192.168.1.10:/remote/dir/-a归档模式,保留权限和时间戳;-v显示过程;-z压缩传输。注意源目录末尾的/,表示传输目录里的内容,而不是把目录本身也塞进去。这个细节很多人不注意,传完之后发现目标路径多了一层嵌套。
4.2 压缩归档:tar 命令的几个关键参数
打包压缩和解压是运维日常。tar命令的参数说实话挺多,但常用的就这几个组合:
tar -czvf backup.tar.gz /data/app/ # 打包+压缩 tar -xzvf backup.tar.gz # 解压到当前目录 tar -tzvf backup.tar.gz # 只查看压缩包里有什么参数拆解:c创建,x解压,t查看;z使用 gzip 压缩,v显示过程,f指定文件名(f后面一定要跟文件名,而且习惯放在最后)。解压到指定目录加-C:
tar -xzvf backup.tar.gz -C /opt/app/如果包是.zip格式,用unzip backup.zip -d /opt/app/。压缩时想排除某目录,加--exclude:
tar -czvf backup.tar.gz --exclude='/data/app/logs' /data/app/4.3 软件包管理:apt、yum、dnf 对照表
“装软件”这件事,不同发行版命令不一样,我给一张对照表,方便你碰到什么系统都能上手:
| 操作 | Ubuntu/Debian | CentOS/RHEL 7 | CentOS/RHEL 8+ |
|---|---|---|---|
| 更新软件源 | apt update | yum makecache | dnf makecache |
| 安装软件 | apt install nginx | yum install nginx | dnf install nginx |
| 卸载软件 | apt remove nginx | yum remove nginx | dnf remove nginx |
| 搜索软件 | apt search nginx | yum search nginx | dnf search nginx |
| 查看已装 | dpkg -l | rpm -qa | rpm -qa |
我个人的经验是:先确认系统版本,再选包管理命令。跑cat /etc/os-release一眼就知道。很多新手在 Ubuntu 上敲yum装不上东西,就是因为选错命令了。另外不管用哪个命令,装软件都建议加-y参数跳过交互确认,比如apt install -y nginx,不然安装到一半卡在 “Do you want to continue?” 上。
4.4 Git 日常操作速查:从提交到回滚
Git 是开发必用,也是我见过“命令没记住导致手忙脚乱”最多的地方。最基础又必须记牢的几个:
git status # 查看工作区状态 git add . # 把所有改动加入暂存区 git commit -m "提交说明" # 提交到本地仓库 git pull --rebase # 拉取远端代码并合并,rebase 让历史更干净 git push origin main # 推送到远端最想强调的一个:提交信息别偷懒。git commit -m "fix"这种信息,三天后你自己都看不懂当时改了啥,同事骂你你都不知道怎么回。至少写清楚改了什么模块、修了什么 bug,比如fix: 修复用户登录时验证码过期导致500。
回滚场景也经常遇到。如果刚提交了一个错误的 commit,还没推到远端,用git reset --soft HEAD~1撤销提交但保留改动;如果想把改动也全部丢掉,用git reset --hard HEAD~1。已经推到远端了就麻烦点,git revert生成一个新提交来抵消错误提交,避免强制推送影响到别人。
5. 进阶必看:Docker、GDB 与面试高频题
5.1 Docker 容器管理常用命令
现在问 Linux 命令,面试官很可能顺手接一个“容器怎么查日志”。Docker 命令和普通进程命令是两套体系,但逻辑上能一一对应。我列几个最常用的:
docker ps # 查看正在运行的容器,-a 看全部 docker logs -f 容器名 # 跟踪容器日志,等于 tail -f docker exec -it 容器名 bash # 进入容器内部 docker restart 容器名 # 重启容器 docker stop 容器名 # 停止容器 docker rm 容器名 # 删除容器排查容器问题,我有个经验:先看docker ps,再看docker logs。如果容器在反复重启(RESTART列的数字一直在涨),十有八九是启动命令有问题或者依赖的服务没起来。这时候进容器内部一般也来不及,优先看日志报错最直接。
5.2 GDB 调试核心命令
gdb是 C/C++ 程序调试的重型工具,速查表里只写几个核心命令,够你入门和应急:
gdb ./program # 加载可执行程序 (gdb) break main # 在 main 函数打断点 (gdb) run # 开始运行 (gdb) bt # 程序崩溃时查看调用栈 (gdb) info locals # 查看当前局部变量 (gdb) print 变量名 # 打印变量值 (gdb) continue # 继续运行到下一个断点 (gdb) quit # 退出最常用的是bt,程序一崩,bt一下,崩溃调用栈就出来了,可以直接定位到是哪个函数、哪一行出的问题。这个命令的价值怎么强调都不为过。
5.3 面试高频 Linux 命令题参考
结合这些年面试和被面试的经验,Linux 命令相关的面试题集中在这几个方向:
- 如何查看系统负载?
top、uptime。要能解释 load average 的含义。 - 如何查找占用端口 8080 的进程?
ss -lntp | grep 8080或者lsof -i:8080。 - 如何实时查看日志文件?
tail -f或者tail -f | grep 关键字。这题很常见,而且面试官常追问“如果日志文件被轮转了怎么办”,答案是用tail -F(大写 F),它会跟踪文件重新创建。 - 如何查看系统内存?
free -h。 - 如何批量杀掉匹配某个关键字的进程?
ps aux | grep "java" | grep -v grep | awk '{print $2}' | xargs kill -9。这是一个组合拳,面试官很爱考。 - 如何将命令输出保存到文件并同时显示?
tee,比如df -h | tee disk.txt。
注意:
kill -9是要慎用的。它强行终止进程,不给进程任何清理资源的机会,可能导致数据丢失、文件损坏。面试问“为什么不用 kill -9”时,标准回答是:先kill(默认 SIGTERM)让进程优雅退出,不行再升级到kill -9。
6. 常见问题与排查技巧实录
6.1 命令找不到、权限不够怎么办
“command not found”是新手最常碰到的报错,原因通常有几种:命令没安装、不在 PATH 路径里、或者你想执行的文件不在当前目录。排查方式:
which 命令名 # 查看命令路径 echo $PATH # 查看 PATH 路径有哪些 ls /usr/bin/ | grep 命令名 # 看看包里有没有这个命令比如你用nslookup报 not found,在 CentOS 上可能是没装bind-utils,装一下就行。还有一种情况是文件明明存在,直接./script.sh报“Permission denied”,这是没有执行权限,chmod +x script.sh解决。
6.2 管道与转义:新手最容易踩的坑
管道是 Linux 命令组合的精髓,但有几个细节容易踩坑。第一,grep过滤出来的进程会匹配到grep自己,所以ps aux | grep nginx结果里总有一行grep --color=auto nginx,这是它自己。排除办法是grep -v grep,更优雅的写法是pgrep nginx。
第二,$符号在双引号和单引号里的行为不一样。grep "error$"里$有正则的意思,表示行尾;但在echo "$HOME"里$HOME是变量。如果你想把$符号当普通字符传给 grep,一定要用单引号包起来:grep '$' file。
6.3 现场排查流程:一个真实故障案例
去年有次生产环境的订单服务突然告警,接口超时率飙到 30%。我接到通知后的排查路径是这样的:
top看负载,发现 load average 到了 8(机器是 4 核),CPU 100%。确认是负载问题,不是网络问题。- 按
P排序,看到java进程占了 300% 多的 CPU。多核情况下一个进程可以占多个核的 CPU,这个记一下,不要看到超过 100% 就觉得是 bug。 ps aux | grep java拿到完整的启动参数,确认是订单服务的进程。jstack PID打印 Java 线程栈,发现大量线程卡在同一个方法的getConnection上,初步判断是数据库连接池打满了。ss -lnt | grep 3306看数据库端口连接数,确实暴涨。- 反馈给 DBA 排查数据库慢查询,最后定位到一条新上线的 SQL 没走索引,全表扫描把连接池拖垮了。
整个过程大概 15 分钟,核心就是:先用top找到嫌疑进程,再用ps确认身份,最后用对应语言的排查工具(Java 用jstack,其他语言也有类似工具)定位到具体代码层面。Linux 命令在这里扮演的是帮你在系统层面快速缩小范围的角色。
排查类的技能,练得多了就有手感。我自己整理了大概半年时间,把上面这些命令用到“不用过脑子就能敲出来”的程度,之后再遇到故障,压力就会小很多。你可以在自己的机器上多模拟几遍故障场景,比如故意kill一个进程、把磁盘写满、把一个端口占掉,然后用这套命令体系去诊断。练过一次,比看十遍速查表都管用。
最后再分享一个小习惯:我平时会把速查表做成一个cheatsheet.md存在本地,每次遇到新命令或者踩了新坑,就顺手往里面加一行。这个文件到现在已经积累了上千行,但它仍然只是我的“提词器”——真正干活时靠的是手感和思路,表只是兜底的。你也试着建一个属于自己的速查表吧,从整理今天看到的这几条开始,慢慢它会变成你的私人排障手册。