
1. 先想明白学命令的本质是学“怎么问系统要东西”很多朋友拿到一本Linux基础命令大全第一反应就是找份命令清单开始背。我见过不少人背了一个月ls、cd、cp、mv真到了Linux服务器上还是手足无措。原因很简单你背的是命令拼写而不是命令背后的机制。Linux里几百条命令真正高频用到的不超过五六十条但这五六十条命令的组合方式才是决定你能不能干活的關鍵。Linux的交互界面基本就是Shell常见的是Bash。你可以把Shell理解成一个翻译官你在终端输入一串字符Shell负责解析它、找到对应的可执行程序、把参数传过去执行。所以命令本质上就是一个程序文件比如ls对应/usr/bin/lsrm对应/usr/bin/rm。Shell怎么知道去哪找这些程序靠的是环境变量PATH。你可以用which ls或type -a ls查看命令的完整路径这能帮你理解为什么有些命令在某个用户下能用、换个用户就提示“command not found”。多半就是那个用户环境里的PATH没包含对应目录。搞清楚了这层关系学命令的正确姿势就不是死记硬背而是掌握三件事命令的职责是什么、它接受什么参数、怎么和其他命令配合。最直接的自学工具是man和--help。man ls能让你看到这个命令的所有参数说明配合man -k 关键字等价于apropos还能模糊搜索相关命令。我面试别人的时候最喜欢问一句“如果有个命令你不太会用你怎么查资料”能脱口而出man、--help、apropos的人基础基本不会差。出于这个思路我在下文不打算简单罗列命令名而是按“场景模块”把命令串起来。每个场景里哪些命令是必会、哪些参数最常用、哪些坑最容易踩我会逐个讲透。放心这篇“Linux基础命令大全”不是字典而是一份能直接上岗的地图。1.1 命令、Shell与PATH别被“命令找不到”卡住先做个小实验。你在终端敲echo $PATH会看到一串以冒号分隔的目录这就是Shell默认搜索命令的路径列表。当你输入ls时Shell会依次去这些目录下找有没有名为ls的可执行文件找到就运行。这个机制解释了相当一部分“灵异事件”比如刚装好的Python敲python3提示要安装但明明装过了。大概率是安装后的路径没写进PATH或者你把命令装到了某个编译安装目录而Shell不知道去哪找它。实践中我建议你用下面几个命令摸一下自己环境的底细which 命令名显示命令所在路径。比如which python3。type 命令名查看一个命令是外部命令还是Shell内置命令。比如type cd你会发现它是Shell内置的。hash -rShell会缓存命令路径有时候你重装了某个软件路径变了但Hash缓存还在敲命令仍走旧路径执行hash -r可刷新缓存。这套逻辑对之后排查“明明装了软件但无法启动”的问题非常管用。很多运维老手排查问题的第一步就是which先确认你调用的到底是哪个二进制。同样的命令可能因为PATH顺序不同跑的是不同版本比如/usr/bin/python3和/usr/local/bin/python3可能根本不是同一个版本。1.2 高效学习法不背命令清单背“动词对象参数”套路我的建议是把命令拆成三个要素动词命令本身、对象文件/目录/进程、参数怎么干。例如cp -r /etc/nginx /data/backup动词是cp对象是/etc/nginx目标是/data/backup参数-r表示递归复制目录。绝大部分命令都符合“动词对象参数”的结构一旦你习惯了这个思维遇到新命令时就不会慌先看它操作什么对象再看看参数是控制行为还是控制输出。另外别一次性贪多。我教新人一般按“七步渐进法”来一步一批命令第一步文件目录类ls、cd、pwd、touch、mkdir、cp、mv、rm 第二步查看文本类cat、less、head、tail、grep 第三步权限类chmod、chown、useradd、passwd 第四步进程与系统类ps、top、kill、free、df 第五步网络类ping、curl、ss、netstat 第六步打包压缩与传输tar、zip、scp、rsync 第七步组合操作find、xargs、grep、sed、awk每批命令都用一两天在虚拟机或真实服务器上反复敲直到不看文档也能说出来某个命令的常用参数。后面几章我就按这个顺序把每个模块里最值得掌握的细节展开讲。2. 文件与目录操作每天90%时间都在这里真正上过Linux服务器的人都知道日常操作绝大多数时间都在跟文件和目录打交道。这一章的命令不要求你全部背下来但要求你对高频参数的肌肉记忆足够熟。熟到什么程度呢闭着眼睛都能知道ls -lh输出该看哪一列cp -a和cp -r区别在哪。有了这种熟练度你才可能在面试或生产中快速反应。2.1 看与走pwd、ls、cd 的实用细节先讲ls。最常用的组合是ls -l显示详细列表、ls -a显示隐藏文件、ls -lh人性化显示大小、ls -lt按时间排序。很多人会忽略ls -d它配合通配符时特别好用比如查看当前目录下一级子目录列表可以写ls -d */不然系统会展示目录内部内容而不是目录本身。还有个ls -i能显示inode号排查硬链接、删除被占用的大文件时会用到。再说cd。只要记住cd -回到上一次所在目录和cd ~回到当前用户家目录就够应付日常。稍微进阶一点的是pushd/popd目录栈但我实测下来在多数服务器环境里这命令用的概率很低。你只要理解相对路径和绝对路径就行绝对路径从根/开始写比如/etc/nginx/nginx.conf相对路径以当前目录为基准比如../conf/nginx.conf。写脚本时推荐用绝对路径避免当前目录不明确导致复制、删除操作落到错误目标上。最后是pwd它唯一的作用就是问你“我现在在哪”但当你误入一个深层次目录或者看别人写的脚本时pwd能让你快速定位上下文。配合ls使用判断你当前的相对位置这比靠记忆猜测靠谱得多。2.2 增删改与复制touch、mkdir、cp、mv、rm 的避坑要点touch和mkdir属于创建类命令。touch的隐藏用法是更新时间戳或批量创建空文件比如touch file{1..10}.txt能一次性创建十个文件。mkdir -p a/b/c则可以递归创建多层目录脚本里经常用因为目录已存在时mkdir -p不会报错这在自动化部署里能省不少判断。cp重点要说三个参数-r递归复制目录、-a归档模式保留权限、时间戳等属性、-i覆盖前询问。日常复制目录建议用cp -a而不是cp -r因为-a相当于-r加保留全部属性。很多新人复制一个配置文件到别处后程序起不来就是因为cp后文件权限和属主变了而cp -a就没这问题。另外如果你要对大量文件做复制备份优先考虑rsync而不是cp这个后面网络章节会说。mv有两个容易忽视的点。第一mv在同一个文件系统内是“改个名字”的操作几乎瞬时完成跨文件系统移动则是先复制再删除耗时差距巨大。所以你往服务器上移动大型文件时如果跨了磁盘分区别以为mv卡死了。第二mv也有覆盖风险建议养成加-i或使用-n不覆盖已存在文件的习惯。脚本里尤其要注意mv覆盖文件时不会给任何提示。rm是最危险的一条rm -rf绝对要慎用。我见过不止一次有人把变量没拼对导致rm -rf $DIR/里的$DIR为空最后执行成rm -rf /。虽然现在主流发行版对根目录删除有保护机制但损失已经造成了。我的建议是在交互式终端里给rm设置别名alias rmrm -i脚本里如果必须删除先echo打印完整命令确认一下路径再注释掉echo执行真实删除。另外数据库或重要日志文件误删后第一时间要lsof | grep deleted查找是否存在进程还持有该文件的句柄如果进程还在运行你还能通过/proc/进程号/fd/把数据捞回来这个技巧救过我好几次。2.3 查找文件find、locate、which 的分工find是Linux里最强大的查找工具但它语法复杂很多人只会用find / -name *.log。我建议至少掌握这几个常用表达式find . -name *.conf按名称精确匹配-iname忽略大小写。find . -type f和find . -type d按类型过滤文件或目录。find . -mtime -3查找最近三天内修改过的文件。-mtime 3是三天前修改过的-mtime -3是三天以内注意符号区别。find . -size 100M查找大于100MB的文件排查磁盘占用时很好用。-exec和-delete前者对找到的文件执行命令比如find . -name *.tmp -exec rm {} \;后者直接删除但要把筛选条件写准确。find还有个经典搭档是xargs。比如批量给所有.txt文件增加前缀备份可以写find . -name *.txt | xargs -i cp {} {}.bak。xargs默认会把输入按空格拆开遇到文件名带空格会出问题要加-0配合find -print0这是自动化脚本里的标准写法find . -name *.txt -print0 | xargs -0 rm -f。locate是基于数据库的快速查找速度比find快很多但数据库可能不是实时更新的新创建的文件可能找不到需要先执行updatedb更新索引。which上面说过了用来定位命令本身。三者的分工可以这样理解which找谁在 PATH 里locate基于索引全盘快速找find实时精确找但慢。日常临时查找我用locate脚本或精确操作一律find。3. 文本处理运维的吃饭本事Linux的哲学之一是“一切皆文件”日志、配置、接口返回都是文本。所以文本处理命令熟练度直接决定了你能不能快速定位线上问题。我常说面试运维grep、sed、awk这三板斧先耍明白其余都好说。3.1 查看文件cat、less、tail、head 怎么选cat适合查看小文件或拼接内容cat file1 file2 file3是常用的拼接姿势。但大文件用cat会刷屏刷到怀疑人生这时候用less。less支持上下翻页、空格翻页、/关键字搜索、q退出读日志时基本离不开它。如果你只想看文件的头尾用head和tail比如tail -n 50 app.log看最后50行head -n 20 app.log看前20行。重点说下tail -f和tail -F的区别。tail -f会持续跟踪文件并在内容追加时滚动输出非常适合看实时日志。但如果日志文件被轮转rename 或 rebuildtail -f会继续追踪旧文件新文件内容反而看不到了。tail -F则能在文件轮转后重新打开同名文件所以生产环境排查日志我建议直接用tail -F。配合grep还能过滤关键字比如tail -F app.log | grep ERROR。3.2 过滤与统计grep、sort、uniq、wc 的组合拳grep基本用法是grep 关键字 文件但实际生产中很少单独用。先说常用参数-i忽略大小写、-v反向匹配、-c只统计匹配行数、-l只列出包含匹配内容的文件名、-n显示行号、-E启用扩展正则。例如想从配置里排除注释行可以grep -v ^# nginx.conf。想匹配多个关键词用grep -E error|warning或者egrep二者等价。wc用于统计行数、字数、字节数。最常见的是wc -l统计行数分析日志规模时很有用。sort用于排序uniq用于去重。三者组合的经典场景是统计日志中IP访问次数排行awk {print $1} access.log | sort | uniq -c | sort -rn | head -20这里awk {print $1}取日志每行第一个字段通常是IPsort把相同IP排一起uniq -c统计每个IP出现次数sort -rn按次数从大到小排序最后head -20取前20名。这条命令是我排查流量异常时的首选也是面试常考题。其中sort的-n是按数字排序-r是倒序若不加-n10会排在2前面这细节很多人会踩坑。3.3 文本修改与提取sed 与 awk 的地基sed最常用的就是替换。语法结构是sed s/旧内容/新内容/标志 文件s是替换命令默认只替换每行第一个匹配行尾加g表示全局替换。例如把配置里所有127.0.0.1替换成0.0.0.0并直接写入文件可以写sed -i s/127.0.0.1/0.0.0.0/g。注意-i是直接修改原文件不加-i只是输出到终端。我建议第一次用-i时先带后缀做备份sed -i.bak s/xxx/yyy/g 文件这样会生成一个.bak备份文件万一手滑还能还原。awk的威力则在于按列处理文本。基础结构是awk 条件 {动作} 文件。$0表示整行$1、$2依次表示第1、2、3个字段默认按空格或Tab分隔。内置变量NF表示每行字段数NR是当前行号。比如打印每行行号和第一个字段awk {print NR, $1} file。awk的进阶用法太多了日常先掌握字段提取、内置变量、简单的求和统计就够用比如awk {sum $1} END {print sum}可以对第一列求和这是计算日志响应时间总和、流量总和的常见写法。4. 权限、进程与系统状态让系统听你的很多Linux初学者对权限和进程这两个模块天然发怵总觉得数字权限没逻辑、进程状态看不懂。其实权限就一套“数字换算”规则进程管理就几个状态字母加一个kill捅破窗户纸之后非常简单。4.1 权限模型chmod、chown、umask 的底层逻辑Linux每个文件都有三组权限属主u、属组g、其他用户o每组又分读r4、写w2、执行x1三项数字用累加表示。比如chmod 754 file7421代表属主具备读写执行541代表属组具备读和执行4代表其他人只读。这个换算必须烂熟于心面试问“某文件权限是754其他人能写吗”答不上来基本凉凉。chmod除了数字法还有字母法比如chmod ux script.sh表示给脚本属主加执行权限。字母法比数字法更精确不会误动其他组的权限我改单个权限位时习惯用它。有个新手常犯的错误是用chmod -R对目录递归改权限把目录里所有普通文件的执行权限也加上了结果导致文件变成可执行虽然功能上不影响但很丑也增加了安全风险。正确的做法是目录和文件分开处理例如find /data -type d -exec chmod 755 {} \;和find /data -type f -exec chmod 644 {} \;或直接chmod -R urwX,go-wX /data注意大写X只在目录或已有执行权限的文件上添加执行位这是标准做法。chown修改属主和属组基本格式是chown 用户名:组名 文件。比如chown www:www /data/www。改属主权限时往往需要root或sudo权限普通用户只能改自己文件的权限。umask则决定新文件默认权限比如umask 022是用得最多的值它表示新建文件默认 644、新建目录默认 755。你在一个环境里发现新创建的文件其他用户也能写先检查umask改成umask 022就解决了。4.2 进程管理ps、top、kill 的正确姿势ps最常用的两个组合ps aux和ps -ef。两者都能看全量进程输出略有差异。ps aux的STAT列能反映进程状态常见的S是睡眠、R是运行、Z是僵尸。看到僵尸进程别慌它表示子进程已结束但父进程没有回收一般等待父进程处理或父进程重启后就会清理。如果想查某个服务是否在运行用ps aux | grep nginx配合grep -v grep过滤掉grep本身的进程更干净或者直接用pgrep -fl nginx这个命令是专门干这个的更规范。top是动态查看系统资源消耗的工具。进去后常用的几个交互键P按CPU排序、M按内存排序、T按累计CPU时间排序、q退出。排查性能问题先按P看CPU占用最高的进程再按M看内存占用。如果你只想看某用户或某服务占用可以按u输入用户名过滤。更静态的替代方案是ps aux --sort-%cpu | head -10直接打印CPU占用前10的进程。kill只是向进程发送信号默认是发送SIGTERM15请求进程优雅退出kill -9则是强制杀死进程没有机会保存状态或清理资源。很多人一遇到进程挂死就kill -9这是下策。规范顺序是先kill 进程号SIGTERM等几秒再看不行才考虑kill -9。有些进程会捕获SIGTERM做清理工作比如Nginx可以平滑退出、Java应用可以做优雅停机直接kill -9可能导致数据不一致。补充一个小技巧kill -l能列出所有信号名称和编号面试问起不至于懵。4.3 系统资源查看df、free、du 的重点解读df -h查看磁盘分区使用率-h是人性化显示大小。排查“磁盘已满”问题时第一件事就是df -h看看哪个分区满了。有时候df显示满但du -sh /统计出来的总占用却对不上这时候八成是有已删除但仍被进程占用的文件。经典处理方式是lsof | grep deleted找到占用进程重启进程或清空文件即可释放空间。du -sh 目录用于统计目录大小du -sh * | sort -rh | head -10可以找出当前目录下占用最大的前10个子目录这是排查磁盘空间的利器。它和df的区别要搞明白df看的是文件系统维度分区du看的是目录维度内容。比如du -sh /data统计的是/data下所有文件总大小但/data所在分区的总占用可能比这大很多因为还包含其他目录和元数据。free -h查看内存。新手看到free输出的used占了90%多就紧张其实Linux的理念是“内存不用白不用”它会把空闲内存用作缓存cache/buffer这不算真正占用。所以重点看available那一列它才是真正可分配的内存。当available趋近于0时才说明内存确实紧张。另外用top里的内存列可以看进程维度占用但要想看某个进程具体占多少内存用ps aux | grep 进程名然后看RSS那列更直观pmap可以查看进程内存映射的细节排查内存泄漏时会用到。5. 网络与远程排查问题的基本功服务器环境里出故障要么是磁盘要么是网络。网络命令不需要掌握很多但每条都要用到位。特别是现在很多同学买云服务器、自己搭环境网络排查能力基本决定了你能不能独立解决线上问题。5.1 连通性排查ping、ss、curl 的分层思路网络排查我习惯按“链路层→传输层→应用层”的思路来。第一层是物理链路和IP连通性用ping。ping -c 3 目标IP只发3个包避免无休止地ping。看到丢包率高或延迟大说明链路有问题完全不通不一定是对方挂了也可能本机防火墙拦了ICMP所以ping不通不要急着下结论。第二层是端口连通性。传统命令是netstat -tlnp或ss -tlnp现在主流系统建议用ss它更快且信息更全。ss -tlnp会列出所有监听中的TCP端口和对应的进程你发现端口被占用时用它查出是谁占了比如ss -tlnp | grep 8080。想主动测试某个远程端口通不通可以用nc -vz 目标IP 端口或者用/dev/tcp方式echo /dev/tcp/1.2.3.4/80 echo open。第三层是应用层最常用的就是curl。curl -I https://example.com只请求响应头可以看到HTTP状态码、Server类型、响应时间等关键信息。调试接口时curl -v能看到详细请求和响应过程包括TLS握手细节、重定向等是定位问题最直接的工具。比如一个接口偶发超时你用curl -w time_total: %{time_total}\n就能统计总耗时再配合-w里的其他变量能拆解出DNS解析、TCP连接、TLS握手、首字节等各阶段耗时这比看什么监控都实在。下载文件则用curl -O 文件URL或wgetwget支持断点续传-c和递归下载下载大文件或整站资源时更顺手。5.2 文件传输scp 与 rsync 的场景取舍远程拷贝文件最基础的是scp语法像cp一样只是要加主机名和路径比如scp file.txt user192.168.1.100:/data/。它会走SSH加密通道安全性没问题但功能比较单一不支持增量。如果你要同步大量文件或者需要定期备份目录rsync才是正解。rsync的典型用法是rsync -avz /data/backup/ user192.168.1.100:/data/backup/参数含义很稳定-a归档模式保留权限、属主、时间戳-v显示过程-z传输时压缩。rsync的核心优势是增量同步只复制差异部分第一次全量之后每次只传变化的文件。做定时备份时配合cron非常稳比如每天凌晨把线上数据同步到备份机。需要注意的目标路径末尾的斜杠是有讲究的rsync -avz /data/ userhost:/backup/会把/data目录本身放过去而rsync -avz /data/ userhost:/backup则直接将/data下的内容放进去。这个斜杠差别导致过很多次误操作建议先在本地小范围测试。还有个常见的节目是从网上下载Linux发行版镜像或软件包比如打算在虚拟机里安装Linux很多人遇到蓝屏或安装失败一个重要原因就是镜像文件没校验完整。下载后用md5sum或sha256sum 镜像文件对比官方提供的校验值一致才说明下载完整。这个习惯能避免大量玄学安装问题。顺带说一句现在桌面Linux生态其实很不错统信UOS、Deepin这些发行版的桌面体验、软件商店都已相当成熟新接触Linux的朋友完全可以直接在虚拟机或老电脑上从装一个国产发行版起步学习成本比大多数人想象的低得多。6. 面试与日常避坑高频考点与真实翻车现场最后一章专门解答两类问题一是面试现场常考的命令题怎么答才显得有水平二是日常操作中那些“看着是命令问题其实是思维问题”的翻车现场。这两块是我带新人时最常讲的内容。6.1 面试高频命令题拆解面试官问你“Linux基础命令”说明他要的不是你会背ls而是看你面对实际任务时的解决思路。我总结了几个出镜率极高的考题和标准解法第一题批量把当前目录所有.log文件重命名为.log.bak。思路是循环加移动三种答法都行for i in *.log; do mv $i $i.bak; done或者rename s/\.log$/.log.bak/ *.log或者find . -name *.log -exec mv {} {}.bak \;。能答出第一种是基础能答出第二种是经验能答出第三种并解释{}和\;的含义才是加分项。第二题从access.log中统计访问量最高的10个IP。标准答案就是前面写的awk {print $1} access.log | sort | uniq -c | sort -rn | head -10。这道题的价值在于它考察了awk、sort、uniq、head四个命令的组合能力能完整写出来并且解释每一步的基本可以认定有真实使用经验。第三题找出系统中超过1GB的大文件。答find / -type f -size 1G -exec ls -lh {} \;基本就拿分了。再补充一句“通常还要加2/dev/null过滤权限报错”面试官会马上对你另眼相看。第四题如何查看Nginx是否在运行以及它的配置路径。很多人只会ps aux | grep nginx更规范的是pgrep -fl nginx再配合nginx -V或nginx -t检查配置。如果你还能说出用ss -tlnp | grep 80验证监听端口面试官对你的掌握程度就有了正面认知。6.2 常见翻车现场PATH写错、管道失效、删错文件第一个高频翻车改PATH改坏了。有次我把自己家目录写到PATH最前面然后不小心存放了一个恶意脚本刚好名字叫ls导致所有ls操作都执行了那个脚本。这类问题好解决用绝对路径/bin/ls临时绕过再修正PATH。这也解释了为什么我前面强调which和type的用途——先搞清楚你要执行的东西到底是谁。第二个高频翻车管道失效。很多人写cmd1 | cmd2 | cmd3发现结果不对却不理解管道本质上只是把前一个命令的标准输出接到后一个命令的标准输入它不保证处理顺序而且如果某个命令失败默认不会中断管道除非开了set -o pipefail。排查管道问题最简单的方法是先分段执行比如想看awk输出对不对就单独跑awk {print $1} access.log | head -10确认这一层没问题再往后接。别图省事一次性写一整条长管道出错了都不知道哪一段跪了。第三个翻车rm -rf删错。前面提过环境变量为空导致删根目录的案例。我再补一个细节写删除脚本时先find打印出要删的文件列表人工检查一遍列表内容再执行删除。或者把删除路径拼接到变量后用[ -n $DIR ]判断变量非空再执行rm -rf $DIR多一层判断就能保住系统。6.3 日常小技巧让命令更好用的几个配置最后聊一点能实实在在提升效率的配置。第一个是alias。在~/.bashrc里加上这些别名能预防很多误操作alias rmrm -i alias mvmv -i alias cpcp -i alias llls -lh alias lals -a第二个是history的妙用。history查看历史命令!$代表上一条命令的最后一个参数!!代表上一条命令。这两个快捷键在重复执行长命令时很顶用。比如先执行了ls /var/log/nginx/access.log下一步想查看这个文件直接tail -F !$即可。Ctrlr反向搜索历史命令也建议练熟记不住的命令直接用搜索拉出来比翻记录快得多。第三个是man命令的翻页技巧。man出来的文档默认用less查看按/可以搜索关键词按n跳到下一个匹配按q退出。这其实是通用技巧在less和man里都适用。第四个是针对脚本调试的set -xe。在脚本顶部加set -x能看到每条命令实际执行了什么加set -e表示出错即停。两者组合是排查脚本问题的标配。有时候脚本报错但你不知道在哪条命令上脱了set -xe后错误位置一目了然。我个人在实际操作中的体会是Linux命令的学习没有捷径但确实有“捷径感”的方法优先掌握少数高频命令的深度用法再用组合拳解决复杂问题。很多命令我至今也会偶尔忘记参数但我始终知道怎么查、怎么试、怎么还原这比背下整本命令大全重要得多。当你有一天发现自己已经能不看笔记就完成一次完整的服务器初始化、日志分析、故障排查时那才是真正把Linux基础命令这块地基打牢了。