
## 1. 先别背命令理解命令是怎么“跑起来”的我见过太多刚接触Linux的朋友抱着一本命令大全从头背到尾背了两周发现还是不会用。问题不在记忆力而在于把Linux命令当成了“单词表”而不是一套可以拆解的规则。Linux常用命令本质上都是“程序参数选项”的组合你只要搞懂它运行的基本逻辑再遇到没见过的命令也不会慌。拿一条最简单的命令来说ls -l /home/user这条命令的组成是ls是要执行的程序-l是选项也常被称为flag/home/user是参数。很多刚入门的人会把“选项”和“参数”混为一谈但理解它们的区别非常重要选项负责改变程序的行为方式参数负责告诉程序“对谁做”。这种规则几乎贯穿所有Linux命令。还有一个容易让人困惑的概念是“为什么有的命令直接输就能跑有的命令要写成./xxx才能跑”。这涉及到一个叫PATH的环境变量。简单说操作系统会在PATH里记录的目录中逐个查找你输入的命令找到了就执行。如果你自己写了一个脚本放在当前目录直接输入脚本名是找不到的因为系统默认不会去搜索当前目录出于安全考虑所以你得显式告诉系统“就在当前目录下”也就是./脚本名。我建议每个人学会第一条命令之前先学会问问题。遇到不认识的命令先用type看它是什么类型用which看它在哪里用--help看最简单的用法说明。比如type ls which ls ls --help这三连击能让你在几秒钟内搞清楚一个命令的来源和基础用法比翻书效率高得多。提示绝大多数Linux命令都支持--help或者-h来显示简短帮助。man手册虽然更详细但很多人一打开man就被长篇大论劝退。新手阶段--help其实更友好。理解命令的基本运行逻辑之后后面的学习就不再是背单词而是积累“套路”。下面我从日常工作最频繁的几个方向逐个拆解哪些命令值得优先花时间以及它们的常见坑在哪里。2. 文件与目录操作每天都在用但坑也最多文件操作是Linux里最基础也最高频的场景。cd、pwd、ls这几个命令是每个人都会用到的但多的是细节。先说说ls。大多数人只知道ls -l能看详细信息但输出里的每一列代表什么很多人其实只记住了一半。第一列是权限第二列是硬链接数第三列是属主第四列是属组第五列是大小第六列是最后修改时间最后一列才是文件名。其中权限位那一串字符比如-rw-r--r--值得花时间彻底弄懂它是后面学习权限管理的基础。再说cd。有一个非常实用的小技巧是两个目录之间快速切换cd -。它表示“回到上一个所在目录”。在A目录和B目录之间反复操作时这个命令能省下大量重复输入完整路径的时间。文件操作里坑最多的是cp和mv。先说cp很多人第一次复制目录时直接写cp dir1 dir2结果报错或者行为不符合预期因为cp默认不会递归复制目录必须加-r选项。另一个容易忽略的参数是-a它相当于-r加上保留属性、权限、时间戳等。备份重要配置时用cp -a比用cp -r更稳。mv看起来简单但它有一个隐藏的行为差异在同一文件系统内移动文件本质上是“改个名字”速度很快跨文件系统移动时系统会先复制再删除速度差异很大。如果你在移动一个超大文件时等了半天不用怀疑哪里出了问题大概率是跨文件系统导致的。这个场景在服务器上尤其常见比如从/home目录往/data目录挪数据一旦不是同一个分区I/O开销就上来了。rm是另一个需要极度小心的命令。rm -rf的威力不需要我多说但很多人忽略的是rm没有“回收站”这个概念删掉就是真删了。我的建议有两条第一在重要目录操作前先pwd确认自己当前在哪第二能用rm -i交互式删除的地方就别偷懒省掉-i。某些生产环境甚至会把rm替换成移动到一个临时目录的alias防止手滑删库。文件操作还有一个很容易被忽略但非常实用的知识点通配符。*匹配任意多个字符?匹配单个字符[abc]匹配a、b、c中的任意一个。比如rm -f log_2024_07_*.txt find /data -name *.log -type f通配符在批量操作文件时能节省大量时间但需要注意它是由shell展开的不是由命令本身处理的。如果你用了引号把通配符包起来比如*.logshell就不会展开它而是把这个字符串原样传给命令。有些命令自己会处理这种通配符有些不会搞混了就会出现“为什么找不到文件”的困惑。3. 文本处理三件套grep、sed、awk 与管道组合Linux下处理文本最核心的三个命令是grep、sed、awk再加上管道符号|它们组合起来能解决绝大多数日志分析和配置修改需求。很多新手觉得这几个命令难是因为没搞懂它们各自的定位其实分工非常清晰。grep是“查找”负责从文本中筛选出包含某模式的行。最常用的选项包括-E启用扩展正则表达式比如grep -E error|warning能同时匹配多个关键词。-v反向匹配输出不包含某模式的行。看日志时想排除一堆无关噪声这个选项很好用。-c只统计匹配的行数不输出具体内容。-A和-B显示匹配行之后和之前的若干行。排查异常日志时只看异常行往往不够上下文才关键。sed按行进行处理最常见的使用场景是替换。sed s/foo/bar/g file会把file中所有的foo替换成bar。如果不加g只替换每行第一个匹配到的内容。另一个常用语法是删除行sed /pattern/d会删除匹配到pattern的行。但新手最容易踩的坑是把sed直接当成在原文件上修改。实际上sed默认只是把处理结果输出到屏幕原文件并不会改变。真正要修改原文件得加-i参数。这个参数也有讲究我强烈建议在-i后面加一个备份后缀比如sed -i.bak s/foo/bar/g file这样原文件会先备份成file.bak出问题还能回滚。生产环境里改配置文件时这个习惯能救命。awk是三者中最“重”的一个它可以按列处理文本还带有简单的编程能力。对于日常使用最核心的语法是awk {print $1}表示输出每行的第一列。$0代表整行$NF代表最后一列。FS可以指定分隔符默认是空白字符但很多日志文件是用逗号或竖线分隔的这时可以用-F指定比如awk -F, {print $2} data.csvawk还有一个内置变量NR表示当前行号经常用来给输出加序号或者配合if筛选行号范围。这三件套的真正威力在于和管道组合使用。我举一个最常见的实际场景排查日志里某个接口返回500的次数。日志格式大致是时间 IP 请求路径 状态码一条命令就能搞定grep /api/login app.log | awk {print $NF} | sort | uniq -c | sort -nr这条命令的思路是先用grep筛出跟指定接口相关的行再用awk取出最后一列状态码接着用sort排序uniq要求输入是有序的然后用uniq -c统计每种状态码的出现次数最后再用sort -nr按次数从大到小排列。整个过程没有任何复杂的编程就是四个命令的接力。理解这种“流水线”思想比死记单个命令的各种花哨参数有用得多。除了三件套日常日志查看也有一组容易混淆的命令cat、less、tail、head。cat适合看小文件文件一大就会刷屏刷到怀疑人生less支持上下翻页、搜索适合交互式查看大文件head和tail分别看文件头部和尾部。其中tail -f是查看实时日志的标配日志追加时它会自动滚动输出排查线上问题基本离不开它。关于重定向也值得多说两句。会将输出覆盖写入文件是追加写入而2是把标准错误重定向到文件21则是把错误输出和标准输出合并到一起。实际使用中很多人想保存命令输出时不小心用了把原有文件覆盖了追悔莫及。所以我在覆盖写文件前都会先确认一下目标文件是否存在如果存在且内容重要宁可用。4. 用户权限与进程管理运维事故的高发地带权限和进程管理是Linux里最容易出“大新闻”的领域。我几乎每年都能听到有人因为权限设置不当导致服务启动失败或者kill错进程导致服务中断的案例。这两块内容在Linux常用命令里属于必须学透的部分。先讲权限。ls -l看到的权限位有10个字符第1个字符是文件类型后9个字符分成三组分别对应属主u、属组g、其他人o。每一组里的rwx分别代表读、写、执行权限。还有一种表达方式是数字法r4w2x1。755就表示属主有读、写、执行权限421属组和其他人有读和执行权限41。为什么配置文件经常用644、可执行文件用755就是因为归属不同权限位的需求不同。修改权限用chmod修改属主和属组用chown。常见的命令有chmod 600 config.key chown -R appuser:appgroup /data/appchown -R的-R参数和chmod -R一样代表递归在处理目录时如果不加只会修改第一层目录本身目录内部的文件不会变这是新手经常踩的坑。还有一个需要注意的点是特殊权限位中的setuid用s表示。简单理解当一个可执行文件带setuid位时运行它的用户会临时获得文件属主的权限。经典的例子是/usr/bin/passwd普通用户修改密码时需要临时以root身份写入系统文件。系统管理员在设置这类权限时要格外谨慎稍有不慎就会产生安全漏洞。进程管理这块最常用的命令是ps和top。ps aux能看到所有进程的完整信息输出里的USER是进程属主PID是进程号%CPU和%MEM是资源占用STAT是进程状态COMMAND是启动命令。排查哪个进程占用过高时第一反应就是ps aux然后按%CPU排序或者直接用top交互式查看实时状态。top启动后有几个常用交互键按P按CPU占用排序按M按内存占用排序按q退出。另外我经常用top -p PID来只观察某个特定进程的资源消耗避免被其他进程干扰。杀掉进程时kill默认发送的是TERM信号信号编号15相当于通知进程“请正常退出”进程有机会做清理工作。如果进程不响应才需要用kill -9KILL信号强制杀掉。但kill -9是强制终止进程不会有机会保存状态或清理临时文件所以能先用kill解决的就不要一上来就kill -9。判断一个进程是否“卡死”不只要看CPU占用还要看STAT状态列。如果状态是D不可中断睡眠通常和磁盘I/O相关或者Z僵尸进程处理思路完全不同。僵尸进程是已经结束但未被父进程回收的进程kill -9对僵尸进程没用需要杀掉它的父进程让系统回收。很多新手遇到僵尸进程第一反应就是狂kill结果发现根本没变化原因就在这里。后台运行也是日常操作的高频需求。命令后加可以让进程在后台运行jobs查看当前shell的后台任务fg把后台任务拉到前台bg则让暂停的任务继续在后台跑。但有一个容易忽略的细节如果你在SSH会话里启动了一个后台任务直接关闭SSH连接这个任务可能会被挂断。要让它真正脱离终端独立运行需要配合nohup或者setsid。经典用法是nohup ./start.sh app.out 21 这里的1把错误输出也写进同一个日志文件避免启动报错被吞掉。启动服务类程序时这套组合很常用。系统资源的查看也不能落下。df -h看磁盘分区使用率du -sh看某个目录占了多少空间free -h看内存使用情况uptime看系统负载。其实top也能看负载但uptime输出更简洁适合快速判断系统是不是“累了”。负载值要结合CPU核数来看一个4核机器负载超过4基本就意味着任务在排队了。5. 网络排查从“连不上”到“定位根因”的完整套路网络排查是最考验命令熟练度的场景之一。很多人遇到“连不上数据库”“网页打不开”就直接怪网络但排查到最后经常发现是服务本身没起来或者是防火墙拦掉了端口。掌握一套固定的排查套路比记住一堆命令名称更有价值。我自己的排查顺序大概是这样的第一步先确认主机之间能不能通。ping是最直觉的工具但要注意ping测的是ICMP协议而很多云环境会屏蔽ICMP所以ping不通不代表网络真的有问题。反过来ping通了也只能说明网络层正常不代表TCP端口就一定通。第二步检查目标端口是否在监听。在较新的Linux系统上建议直接用ss命令ss -lntp这个命令会列出所有监听的TCP端口-l只看监听状态的端口-n用数字显示地址和端口而不是解析成域名-t只看TCP-p显示对应的进程信息。如果你本机明明启动了服务但ss -lntp里找不到那个端口问题大概率出在服务本身可能监听地址写错了比如只监听了127.0.0.1而不是0.0.0.0或者服务启动失败已经退出了。第三步测试远程端口连通性。传统工具是telnet IP 端口能连上就说明TCP握手成功。但很多新系统默认不装telnet这时可以用ncnetcat替代nc -zv 192.168.1.100 3306-z表示只扫描不发送数据-v输出详细过程。如果端口通则显示成功不通则显示refused或timeout。第四步怀疑DNS解析问题时用getent hosts 域名或者nslookup来确认域名解析到的IP是否符合预期。很多时候应用连接失败不是网络不通而是DNS解析到了旧IP。第五步如果连HTTP接口直接用curl来验证是最直观的。curl -I只拿响应头curl -v输出详细握手过程能看到具体的报错信息。我自己排查接口超时问题时最喜欢用curl -w它可以把耗时指标打印出来curl -o /dev/null -s -w DNS解析耗时: %{time_namelookup}s\n连接耗时: %{time_connect}s\n总耗时: %{time_total}s\n https://example.com-o /dev/null表示把响应体丢弃-s静默模式-w按格式输出统计信息。这几个时间指标能帮你快速定位慢在哪个环节如果time_connect大是网络连接问题如果time_total大但time_connect正常可能是服务端处理慢。有一次排查某个应用“间歇性连不上数据库”的问题一开始以为是防火墙拦截但ping也通、telnet也通查了半天没头绪。后来用ss查连接状态发现大量TIME_WAIT状态的连接数据库连接池配置不合理导致连接被频繁新建和关闭最终把连接数打满了。这个案例给到我的启示是网络排查不要只盯“通不通”还要看“连接状态分布”。ss -s可以汇总各种TCP状态的数量是判断连接耗尽问题非常好用的命令。另外再提一句防火墙规则不通时即使服务在正常监听、端口也是通的外部访问依然会被拒绝。所以排查端口不通时最后别忘了确认防火墙状态和规则iptables -L -n很多云服务器还会额外套一层安全组那是云平台层面的规则不在系统内用命令能看到这个也要纳入排查思路。6. 找文件、翻历史、组合命令日常排查的“拼图”玩法命令用得久了你会发现真正的排查工作很少只靠一条命令而是把历史记录、查找、统计这几类命令像拼图一样组合起来用。先说history。它记录了你敲过的命令但很多人不知道history还有几个好用的搭配。输入history再grep某个关键词能快速找回很久之前用过的命令在交互式shell里!!表示上一条命令!ls表示最近一条以ls开头的命令。例如我经常犯的错是忘记在命令前加sudo这时不用重新敲直接sudo !!就能以root身份重跑上一条命令。再说find。find是查找文件的主力命令但它参数多很多人记不住。核心的几个用法find /data -name *.log -type f find /data -size 500M find /data -mtime -7第一条按名字找文件第二条找大于500M的大文件第三条找7天内修改过的文件。排查磁盘空间时配合前面的du -sh能形成一条完整的链路df -h发现某个分区满了du -sh /data/* | sort -hr找出占用最大的目录再逐层进入用du -sh定位到大文件最后确认是日志文件就清理是业务数据就考虑迁移或扩容。还有一类统计命令经常被忽视但其实非常顺手sort、uniq、wc。sort -n按数值排序sort -r倒序uniq -c统计去重后的数量wc -l统计行数。它们单独看都不起眼组合起来就是数据分析的轻量方案。比如统计一个访问日志里有哪些客户端IP在访问、各访问多少次awk {print $1} access.log | sort | uniq -c | sort -nr | head -20还有查找某类配置文件时grep -r的递归搜索功能很实用。不过grep -r搜索时容易混入二进制文件或者一堆无关的目录我通常会加--include限定文件类型grep -r timeout /etc/nginx --include*.conf这套“拼图”玩法的核心逻辑是先明确你想回答什么问题再把多个命令串成一条流水线每个命令只做一件事通过管道把结果接力下去。命令不在多而在于你对每个命令的边界用法足够熟悉。7. 最后分享一点我的个人使用习惯文章写到最后分享几个我实际用下来的习惯也许对你有参考价值。第一个习惯是给高频命令配置alias。敲得最多的命令完全没必要每次都完整输入我会把这些写进~/.bashrc或~/.zshrcalias llls -alhF alias ..cd .. alias grepgrep --colorauto alias dfdf -h alias dudu -sh其中grep --colorauto这个alias特别推荐匹配到的关键词会高亮显示看日志时一眼就能扫到重点。第二个习惯是善用man和--help的组合。遇到不熟悉的命令我一般先--help看摘要如果某个细节有疑问再查man手册而不是一上来就读整本手册。man手册的结构一般是SYNOPSIS看语法DESCRIPTION看功能OPTIONS看参数EXAMPLES看示例。很多命令在man的EXAMPLES部分提供了非常地道的用法这部分价值往往被低估。第三个习惯是定期整理自己的“命令笔记”。别追求大而全只记录真实工作中用到的命令和坑。比如我自己的笔记里经常会写“某次为什么不能直接kill -9而是应该先看子进程”“为什么cp目录必须加-r”这种踩坑记录。时间久了这本笔记比任何命令手册都好用。Linux常用命令这个主题说到底不是一个能不能背完的问题而是你愿不愿意把它当成一套解决问题的工具箱。命令是死的使用场景是活的。先从文件操作、文本处理、权限进程、网络排查这几个最核心的方向入手每遇到一个问题就动手查、动手试用多了自然就熟练了。