前阵子给一批刚转行的学生上Linux基础课第一节课我让他们在虚拟机里敲命令。有个学生问我老师命令这么多哪几个是必须背的这个问题我几乎每年都被问一次。说实话Linux常用命令说多不多说少不少真正干活时翻来覆去就那几十个。但“上课用”和“实战用”有个区别上课要建立体系让你明白命令背后的逻辑实战要解决问题让你在排障时不抓瞎。这篇就来聊聊我上课必讲、日常也必用的那些命令以及为什么这样讲。这篇文章不是按字母表给你列一百个命令而是按场景讲。你跟着走一遍即使现在记不住参数也没关系关键是脑子里先建立一张地图遇到问题该去哪个方向找答案。适合刚开始学Linux的学生、刚转行做运维或开发的新人以及那些已经会敲几个命令但总觉得不成体系的同学。1. 目录与文件操作让手指先跑起来1.1 目录导航别死记 cd要理解你在哪很多新手一上来就背cd /usr/local/nginx/conf这种长路径背完就忘。我上课第一件事是让他们时刻清楚“自己在哪”。三个命令解决pwd看当前位置ls看当前有什么cd改变位置。听起来简单但里面有几个细节值得单独说。cd -这个用法很冷门但极其好用它的意思是“回到上一个目录”。比如你在/etc/nginx下面改配置改完想回刚才的/home/user/project直接cd -就行不用再敲一遍长路径。我见过不少同事不知道这个还在那拼命按上箭头翻历史。cd ~更快直接回当前用户的家目录比cd /home/用户名少敲一半。ls的常用参数我要求学生必须会三个ls -l看详细信息ls -a看隐藏文件ls -t按修改时间排序。再加一个组合拳ls -lrt这在日志目录里最常用——最新的日志排在最下面配合tail -f看文件增长很方便。还有ls -d */只看当前目录下的子目录名不会被一堆文件干扰。这里有个新手必踩的坑看到以点开头的文件就以为不存在。ls默认不显示隐藏文件但.env、.ssh、.bashrc这些恰恰是配置的重要部分。排查问题第一步往往就是ls -la看家目录下是不是多了什么奇怪的东西或者.ssh目录权限是不是不对。1.2 文件操作删不掉和找不回都是教训cp、mv、rm这三个命令的逻辑其实很简单复制、移动、删除。但真正上课时我得花不少时间讲它们“反直觉”的地方。先说mv。它的行为取决于目标路径存不存在mv a.txt b.txt是重命名mv a.txt dir/是移动。很多新手搞不清楚为什么一会儿是重命名一会儿是移动判断标准就一条——目标是不是一个已存在的目录。mv还能用来覆盖文件但默认会直接覆盖没有提示。所以我在上课时都建议加-i参数或者配置 alias让它每次覆盖前先问一句。cp也一样cp -r递归复制目录、cp -p保留属性这个必须记住。举个例子你从测试环境往生产环境拷贝一个应用目录不带-p的话文件的所有者和权限可能全变了启动直接报错。rm是重灾区。我上课时会给学生看一个笑话rm -rf /这种命令以为自己很酷实际是给自己挖坑。rm -rf的-f是强制-r是递归这两个组合起来非常危险而且rm删除的东西不会进回收站也没法撤销。所以我给的建议是能不写-rf就不写非要用也先ls看清楚路径对自己不熟悉的目录先find列出要删的东西确认无误后再删。文件操作还有一个上课必讲的概念软链接和硬链接。ln -s 目标 链接名创建软链接相当于 Windows 的快捷方式链接文件本身很小指向的是目标路径。ln不带-s创建硬链接两个文件名指向同一个 inode改一个另一个也会变。硬链接不能跨文件系统不能用在目录上而软链接没这个限制。怎么理解这两者的差别我在课堂上用的类比是软链接像一张写着地址的纸条纸条没了原文件还在硬链接像同一份档案的两个抽屉标签抽掉一个标签另一个标签照样能找到档案。软链接在实际应用中多得多比如/usr/bin/python就是个软链接指向系统实际安装的 Python 版本。1.3 练手场景在真实目录里摸一遍光说不练没用。每节课我都会给学生留一个简单的场景用cd /var/log进去用ls -lrt看最新的日志文件然后用tail -n 20查看最后20行内容再把这个日志文件cp到自己的家目录下改名做备份。几步操作走完pwd、cd、ls、cp、tail全练到了。这个场景也是日常排障的第一步服务出问题先看日志看日志先找到文件。2. 文本处理三件套grep、sed、awk 和它们的日常用法2.1 先练好 Vim 的三板斧在讲grep、sed、awk之前我要求所有人先会用 Vim。别被“编辑器之神”这种名头吓住上课只需要练熟几招按i进入插入模式按Esc退出插入模式:wq保存退出:q!不保存退出。再加三个移动和编辑操作dd删除当前行yy复制当前行p粘贴。搜索用/关键词然后n跳到下一个匹配N跳回上一个。这套三板斧够用很长时间。很多新手一进 Vim 就出不来就是因为不知道模式的概念——Vim 默认是命令模式这时候敲字母不是输入内容而是执行操作。理解了“模式”这个核心Vim 就不难了。等你熟练以后vim处理配置文件的速度比任何图形编辑器都快这也是服务器上没有图形界面时唯一的编辑方案。2.2 grep从日志里捞东西grep是我上课教的第一个文本处理命令也是日常使用频率最高的命令之一。基本用法就是grep 关键词 文件把文件里包含关键词的行打印出来。但实际工作中远不止这么简单。grep -E支持扩展正则比如grep -E ERROR|WARN app.log一段日志里同时筛出错误和警告。grep -v是反选排除包含关键词的行典型场景是ps aux | grep nginx | grep -v grep——因为grep本身也是一个进程它也会被grep匹配到所以要用grep -v grep把它过滤掉。这个坑几乎所有新手都踩过。grep -c直接数行数不显示内容比如统计报错条数。grep -r递归搜索整个目录在源码或配置目录里找某个配置项特别好用。grep -l只输出文件名grep -n输出行号这两个在查代码定位问题时效率翻倍。我还喜欢教学生一个组合grep 关键词 文件 | wc -l和grep -c 关键词 文件效果一样但前者是管道思维可以继续拼接后面的处理。比如统计日志里某个接口被访问了多少次grep GET /api/v1/users access.log | wc -l如果要按IP排序找访问量最大的前几个就需要配合其他命令了往下看。2.3 sed批量替换与内容截取sed的入门难点在于它同时能做很多事。我上课只讲三个最常用的场景替换、删除匹配行、按行号打印。最常用的是替换。sed s/旧/新/g会把每行所有匹配的旧内容替换成新内容。注意最后这个g代表全局不加的话每行只替换第一处匹配。sed s/192.168.1.10/192.168.1.20/g config.conf这只是输出到屏幕不会改文件。真要改文件得加-i参数。这里有个重要建议新手用-i之前先不加-i看一遍输出确认无误了再执行。或者用sed -i.bak替换的同时生成原文件的备份出问题还能恢复。我在生产环境批量改配置一定带备份这是多年踩坑换来的习惯。第二个场景是删除匹配行sed /^#/d把注释行删掉查看生效配置时很常用。第三个场景是按行号截取sed -n 20,35p 文件只看第20到35行排查问题定位到代码区间时特别方便。sed不需要背太多参数能把这三个场景用好日常工作就够了。2.4 awk按列统计与求和awk是文本处理里最后一件大杀器。它的基本模型是把每一行按分隔符切成一列一列然后按列处理。默认分隔符是空格。最简单的用法是awk {print $1}打印第一列。比如我想看日志里所有访问IPaccess.log 默认格式第一列就是IPawk {print $1} access.log | head-F可以指定分隔符。看/etc/passwd文件时字段用冒号分隔awk -F: {print $1} /etc/passwd这就把所有用户名列出来了。$0代表整行NF代表列数NR代表当前处理到第几行。这些不用死记用一次就记住了。awk还可以做统计。比如日志里统计各HTTP状态码的出现次数awk {print $9} access.log | sort | uniq -c | sort -rn这句话的意思是取每行第九列状态码排序合并去重并计数再按计数倒序排列。一个命令组合就完成了“日志状态码分布”统计这在排查接口错误率时几乎是标配。按列求和也是一个高频场景。日志里每行最后的字节数累加起来就是总流量awk {sum $10} END {print sum} access.logBEGIN和END是这个语法的关键BEGIN在开始处理前执行END在所有行处理完后执行。课堂上我会强调一个常见的坑awk 的$1一定要写在单引号里面否则 shell 会把$1当成脚本参数展开成空值结果就是什么都匹配不到。这个问题我见过很多同事排查半天最后只是引号问题。2.5 组合实例一条命令看接口健康度我上课常举的一个实例是产品反馈某个接口最近时不时报错你手上有当天完整的 access.log怎么快速判断grep /checkout access.log | awk {print $9} | sort | uniq -c | sort -rn输出的结果就是/checkout接口各个状态码的次数统计。如果发现大量500继续grep /checkout access.log | grep 500 看具体是哪几秒报错、什么时间点集中再结合后端日志去查。一个排查链路就从三条命令展开了不需要什么高级工具。3. 用户与权限为什么你会 permission denied3.1 用户是怎么存在的Linux 是多用户系统每个用户都有自己的 ID、家目录和登录 Shell。用户信息存在/etc/passwd密码哈希存在/etc/shadow用户组信息在/etc/group。这三个文件上课必须打开看一遍看完你对用户体系就有具体认知了。/etc/passwd每一行格式都一样冒号分隔有用户名、密码占位符、用户IDUID、组IDGID、描述、家目录、登录Shell。比如root的这行家目录是/rootShell 是/bin/bash。有些系统账号 Shell 是/sbin/nologin意思是这个账号不能登录只能跑服务。明白这个结构后很多问题就好理解了。比如用户删不掉是还有进程在用比如新用户登不上是 Shell 字段写错了比如改了用户名但家目录没改历史文件全乱套。这些都是实际运维中遇到过的坑。3.2 新建用户与修改密码上课教useradd我通常给这样一个完整命令useradd -m -s /bin/bash -G wheel newuser-m同时创建家目录-s指定登录 Shell-G把用户加入附加组。很多新手只敲useradd newuser结果用户没有家目录登录以后连cd ~都进不去自己的目录一脸懵。这就是没理解-m的作用。新建完用户赶紧设密码passwd newuser交互式输入两次密码就完事。这里我在课上会强调一句不要用echo 123456 | passwd --stdin newuser这种非交互方式虽然省事但脚本里明文密码会留在 history 里很不安全。如果实在要在脚本里设置密码至少用read -s交互读取。3.3 rwx 权限文件、目录、数字法权限是 Linux 新手最容易绕晕的地方但本质只有三层r读、w写、x执行每层分别对应文件所有者、所属组、其他人。数字表示法要会算r4、w2、x1把三组数字加起来。比如754所有者是 7rwx组是 5r-x其他人是 4r--。怎么算的chmod 754 文件就设置成所有者可读可写可执行组可读可执行其他人只读。更常见的还是直接用字母chmod ux 脚本.sh给所有者加执行权限chmod ar 文件让所有人可读。上课我要求学生先会字母法再会数字法不然看到网络上的chmod -R 777都不知道是什么意思。这里有个关键区别目录的权限和文件不同。目录的r表示“能列出目录内容”w表示“能在目录里创建或删除文件”x表示“能进入这个目录”。如果只有r没有x你ls能看到文件名但cd进不去stat每一个文件也都报错。所以配置目录权限时755和700是常规操作而777一定要谨慎等于向所有人敞开了写权限。还有一个更隐蔽的坑删除文件的权限不在文件本身而在它所在的目录。也就是说只要你对目录有w权限就算文件本身是只读的你也能把它删掉或改名。这个和 Windows 的“只读文件不能删”完全不同我见过不少从 Windows 转过来的人在这里栽跟头。3.4 chown 和 sudo让对的人做对的事权限不对就改属主这是chown的活。最常遇到的情况是我用 root 拷贝了一个目录到应用目录下结果应用以普通用户身份启动后写不了日志因为目录的 owner 是 root。解决办法chown -R appuser:appgroup /data/app/-R递归修改目录及内部所有文件务必确认路径没写错。这一行命令几乎是发布部署时的标配操作。而sudo解决的是另一类问题普通用户临时执行管理员命令。我上课会让学生先用sudo -l看自己有哪些 sudo 权限再用sudo command执行。做法上是把用户加入wheel或sudo组之后就能用 sudo 了。这里要注意一个原则日常操作尽量用普通用户需要管理员权限时sudo单条命令执行不要整天以 root 身份操作。root 是个没有红线的账号任何误操作都不会拦你。很多人在生产环境上一条rm -rf删掉数据库目录就是因为全程 root 登录、没有容错缓冲。4. 进程、端口和日志从“看到”到“看懂”的一次排障4.1 先看进程ps 和 top服务出问题了第一反应应该是看进程还在不在。ps -ef和ps aux都是查看进程的命令列出的字段包括进程IDPID、CPU占用、内存占用、终端、运行时间、命令。上课我会让学生重点看PID和COMMAND两列PID 是杀进程的依据COMMAND 是判断“这个进程是不是我要的”的依据。ps aux | grep nginx如果 Nginx 在运行会显示 master 和 worker 几个进程。如果什么都没显示说明服务没起来。这种“分号思维”——先用管道把命令连起来——是整个命令行使用的核心思路。top是动态版的任务管理器按P按CPU排序按M按内存排序按k然后输入 PID 杀进程按q退出。上课我会让他们开两个终端一个跑top另一个跑一个消耗CPU的循环这样能直观看到 CPU 占用率在跳动。理解了动态变化比背十个参数都管用。4.2 端口判断ss 替代 netstat服务连不上首查端口监听。新系统上我推荐直接用ss它的输出比 netstat 更清晰速度也更快。ss -tlnp-t只看TCP-l只看监听中的端口-n数字显示不解析域名-p显示进程信息。比如要看 8080 端口是谁在监听ss -tlnp | grep 8080结果里如果有pid12345和users:((java,pid12345,fd95))就说明是 Java 进程占用了 8080。如果找不到端口被谁占用了常见原因是权限不够加上sudo再试。-p参数需要 root 权限才能看进程名普通用户只能看到端口状态。再配合lsof -i:80能列出所有占用 80 端口的进程排查冲突特别直观。这两个命令在网络问题的定位中几乎是每天都要用的。4.3 history 和系统日志排查的起点还有一个经常被忽略但非常关键的排查工具就是history。你可能突然发现某个服务挂了想回忆起刚才敲了什么命令。history会列出当前用户执行过的命令history | grep 关键字快速搜索!!重新执行上一条命令!$代表上一条命令的最后一个参数CtrlR进入反向增量搜索。我处理过的最经典案例是同事说“我什么都没动服务就挂了”。一查history发现他在调试配置文件时执行过一条sed -i把监听端口改掉了然后顺手把进程 kill 了以为重启就没事。日志能告诉你系统发生了什么事history 能告诉你是谁干的、干了什么。排查问题时要两条线一起看。系统日志的入口在/var/log/messages或/var/log/syslog服务日志通过journalctl查看。journalctl -u nginx -f跟防火墙日志、journalctl --since 30 minutes ago只看最近半小时的报错这两个参数组合价值极大。上课我还会提一句dmesg | tail有时候程序没报错但就是起不来dmesg里能看到 OOM 打内存、内核报错之类的底层信息。4.4 让任务在后台跑别被终端关闭带走热词里有一条“linux 让后台运行指令 不因界面退出而退出”这应该是新手刚接触服务器时最容易困惑的问题。你在终端里启动了一个脚本一关窗口任务就没了因为终端断开时HUP挂断信号会发给终端关联的所有进程进程默认就退出了。解决这个问题最基本的是nohupnohup ./run.sh /tmp/run.log 21 nohup的作用是忽略 HUP 信号是把进程放到后台执行 /tmp/run.log 21把标准输出和错误输出都重定向到日志文件。不加重定向的话nohup 会默认写到nohup.out文件也是个坑。如果希望这个进程完全脱离当前终端会话可以用setsid它让进程成为一个新的会话领导彻底告别和终端的关联。如果任务需要交互或者你想随时回来查看运行过程推荐用tmux或screen。tmux new -s work开启一个会话在里面运行命令CtrlB然后按D脱离会话最后用tmux attach -t work重新回来。这样即使 SSH 断开会话也还在。上课时我会让学生做一个实验SSH 登录服务器用nohup启动一个sleep 60然后直接关掉 SSH 窗口重新登录再用ps aux看这个进程还在不在。眼见为实比背参数强十倍。5. 批量操作与实用小工具从敲命令到写命令5.1 find 和 xargs批量处理不再害怕find是查找文件的正确方式。find /data -name *.log按名字找-type f只看普通文件-type d只看目录-mtime 30找30天前修改过的文件-size 100M找大文件。这些参数组合起来日常运维效率直接翻倍。一个真实案例应用日志目录快满了需要找出30天以上的日志文件并清掉。先执行定位find /data/logs -name *.log -type f -mtime 30 | wc -l确认文件数量之后再执行删除find /data/logs -name *.log -type f -mtime 30 -delete这里我非常强调新手一定要先在管道后面接wc -l看清楚数量再执行真正的删除。不要一上来就-delete删完就找不回来了。xargs是配合 find 的管道神器可以把前一个命令输出的每一行作为参数传给下一个命令。比如批量把文件打包find /data/backup -name *.log -type f | xargs tar -czf backup.tar.gzxargs有个经典坑文件名带空格时会被拆成两个。解决办法是find ... -print0加上xargs -0两个命令用空字符分割而不是换行。我在批量处理文件时就踩过这个坑当时一批文件名里带空格直接裂开了。5.2 sort、uniq、wc统计三兄弟sort排序、uniq去重、wc -l计数这三兄弟几乎总是一起出现。上课最经典的组合是统计一个文件里重复行的数量sort file.txt | uniq -c | sort -rnsort先排好序uniq -c给每行加上出现次数再用sort -rn按次数倒序。日志里统计TOP IP、统计错误类型、统计访问量全是这一套。wc -l看文件总行数head -n 20看前二十行tail -n 20看最后二十行。排查报错时tail -f配合grep实时盯日志tail -f /var/log/app.log | grep ERROR有新的报错立刻显示出来不用反复手动刷新。这一条命令在定位问题时的价值我用无数次实践验证过。5.3 空间排查df 和 du磁盘满了是运维最常见的告警之一。df -h看每个分区用了多少、还剩多少du -sh *看当前目录下每个子目录占用多大。组合起来df -h | head -20 du -sh /data/app/* | sort -rh | head -10找出哪些目录占用了最多空间然后一层层往下排查。整个过程不需要任何监控软件命令三分钟搞定。这个排查方法简单粗暴但极其有效我处理过的大多数磁盘告警都是靠这两条命令定位到具体文件然后清理掉的。6. 命令怎么学场景化、看报错、查手册6.1 先记场景再记参数命令背不下来是因为你在按字母表刷命令之间没有关联。我上课教的方法是把命令按场景分组。查文件用find、ls查空间用df、du查进程用ps、top查端口用ss、lsof查日志用tail、grep、journalctl改配置用sed、vi装软件用apt、yum、dnf。遇到一个具体问题先想到属于哪个场景再回忆这个场景下的第一命令是什么。比如“服务为什么连不上”是网络场景第一反应就是ss -tlnp看端口“磁盘怎么满了”是存储场景第一反应就是df -h。场景就像抽屉命令是抽屉里的工具找的时候直接开对应的抽屉比在一堆工具箱里乱翻高效得多。下面这张表是我上课给学生的一页速查这里也分享给大家场景命令说明我在哪pwd当前目录这里有啥ls -lrt按时间倒序列出文件切换目录cd -返回上一个目录复制/移动cp -r / mv注意目标路径是目录还是文件删除rm -i用 -i别裸奔 -rf找文件find /path -name *.log按名字查找文本grep -r 关键词 /path递归查内容看日志tail -f /var/log/app.log实时跟踪看进程ps aux | grep 服务名判断服务存活看端口ss -tlnp确认监听状态看空间df -h / du -sh分区和目录占用统计sort / uniq -c / wc -l日志统计三兄弟后台跑nohup cmd log 21 关终端不掉线提权sudo -l先看自己权限重跑命令!!上一条命令再执行一次6.2 报错信息是你的第一手教材新手遇到报错的第一反应往往是截图发群里问人第二反应才是看英文意思这不对。报错信息里其实已经把答案写在脸上了。最常见的三类command not found说明命令不存在或路径有问题。先which 命令名看能不能找到找不到就检查是不是没安装或者 PATH 环境变量被改了。Permission denied权限不够。ls -l看文件属主和权限位id看当前用户sudo提权。很多时候就是文件 owner 不对改一下chown就行不用暴力chmod 777。No such file or directory路径写错了或者这个软链接指向的文件不存在。用ls -l看软链接是否失效非常常见——比如 Python 升级后/usr/bin/python3指向的版本路径变了就会报这个错。遇到没见过的报错我给学生的标准流程是先把英文读一遍尝试理解关键词再man 命令名查手册最后再去互联网搜“报错原文 操作系统版本”。大多数问题按照这个顺序都能解决。这个习惯比背100条命令都重要因为没有任何人能记住所有命令的报错。6.3 手册和工具man 比搜索引擎优先最后一个建议是别排斥man。很多人觉得man的手册太长、看不动其实只需要掌握几个快捷键/关键词在手册里搜索n跳到下一个匹配N跳回上一个q退出。想看某个命令的参数直接/输入参数名比如搜-i几秒钟就能定位到。日常快速求助可以用命令名 --help它输出的是精简版帮助比man短很多。上课我要求学生先跑--help如果不够再man。还有一个现代工具tldr给出的是真实使用示例而不是冗长手册安装后体验接近“社区速查”。不过没有这个工具也没关系命令用得多了自然就记住了。学命令这件事本质上不是背而是“用”。每解决一个实际问题你脑子里就会多一条路径。下次再遇到类似问题路径会自动弹出来。这比任何命令大全都有用。最后说一点个人体会。我带过很多批学生最后能真正把 Linux 用顺手的往往不是记性最好的而是愿意一次次在终端里试、在报错信息里找答案的人。命令只是一个工具难关在于理解系统的工作方式它怎么组织文件、怎么管理权限、怎么调度进程。理解了这些任何一条没见过的命令你都能很快上手。反过来光背参数不去想原因换个环境换个版本照样抓瞎。建议你按这篇文章的顺序打开终端把每条命令都过一遍再用自己的话复述一遍每个场景对应的解决方案。学完一轮之后做个小测验面试官问你“软链接和硬链接有什么区别”或者“端口被占用了怎么定位”你能不能在两分钟内说清楚并演示出来能就说明这套内容你真的掌握了。