
很多朋友学Linux的时候喜欢抱着厚厚的命令大全啃觉得把所有命令背下来就万事大吉。我之前带新人时也经常听到这种困惑看了一遍感觉都认识真到服务器上处理问题的时候打开终端却不知道从哪敲起。这篇Linux基础下和上篇不一样上篇讲的是系统安装、目录结构这些底层的理解这篇专门聊聊工作了几年之后回头看最值得沉淀下来的那些常用命令。准确说不是某一个命令让我记住它而是某个命令在某个真实场景里救了我我才会把它放进自己的常用清单。这篇内容不需要你单独装什么软件一台带Linux环境的主机就行虚拟机也好、云服务器也好甚至Windows装了WSL也可以跟着操作。我会把命令分成文件处理、文本操作、进程管理、网络排查、磁盘存储这几大块每块不是简单罗列命令选项而是按工作中真正的用法来写比如哪个参数最实用、哪个坑我踩过、什么时候用这条命令比那条命令更合适。新手看完能直接上手敲有经验的也可以当个查漏补缺的速查参考。1. 内容整体设计与思路拆解1.1 为什么“工作中常用命令”不等同于“命令大全”市面上的Linux命令大全收集了上百条命令、上千个参数但坦白说我工作这些年常用的命令一只手数得过来。这不是夸张是实际干活的状态。命令大全能帮你查不缺漏但没办法帮你判断什么场景下用什么命令。而“工作中常用命令”这件事强调的是两个维度一个是频率一个是不可替代性。频率好理解每天都要用的cd、ls、grep、ps这些属于肌肉记忆型。不可替代性则更重要比如你排查磁盘满了的问题df和du能看出来空间不够但真正定位到哪个大文件占的还得靠du逐一排查这时候少一个都不行。所以我这篇内容的设计思路是既照顾高频基础命令也兼顾关键时刻用来救命的命令两条线并行。1.2 选命令的三条标准我在整理这篇命令总结的时候给自己定了几条筛选标准也顺便分享给你参考一是看它能不能解决一类问题而不是单一场景。比如find不光是找文件它还能配合批量删除、权限修改学会一条顶七八条。二是看它有没有替代品。能替代的都归到“了解即可”我会在文中明确说没必要花太多时间。三是看操作能否复制给其他人。就是说一条命令不仅是自己会用还得能总结成经验告诉同事这种命令才值得深入学。满足这三条的命令才算得上“常用命令”。按这个标准筛下来量不大但每一条都值得弄懂原理。1.3 工作场景驱动的内容组织方式这篇内容的组织逻辑是反过来的。一般教程是按命令分类我说场景更合适。因为很多人卡壳就卡在“知道命令但不知道什么时候用”。比如看到CPU高该用top还是ps看到端口被占用是netstat还是lsof这些选择如果单独讲命令很难讲出区别但放在一个故障场景里答案就很自然。所以我接下来每个部分都会先抛出一个工作里常遇到的场景再给出该场景下最顺手的命令组合。这样不只是记忆命令而是在练一种解决问题的思路。命令会忘思路顺了之后很容易自己推导出该用什么工具。2. 核心细节解析与实操要点2.1 文件与目录处理ls、cd、cp、mv、rm之外的关键补充ls和cd不用多说每天敲几十遍也不稀奇。我想重点说的是几个容易被忽略但效率极高的变体用法。ls -lh大家都熟显示人类可读的文件大小。工作里我更常用的是ls -lt按修改时间倒序排列配合head -5能快速找到最近改过的文件。排查问题的时候经常遇到“上一个人改了什么东西导致服务挂了”这条命令几乎能立刻锁定目标文件。补充一个参数ls -lrt可以反过来按时间正序看最老的文件清理日志目录的时候很有用。cp和mv的两个常用参数-r递归拷贝目录-i覆盖前提示。这两个基础到不需要解释但我想强调一个习惯在涉及其它用户目录或者/etc配置目录的时候cp之前先想一下需不需要保留原属性。这时候用cp -p可以保留权限和时间戳避免拷完文件之后权限变了导致服务启动不了。这事儿我踩过坑当时是拷贝了一个证书文件没加-p结果服务端无法读取排查老半天才发现是权限被重置了。rm是个危险命令生产中尽量用rm -i养成先确认的习惯。更好的是用mv把文件挪到临时目录确认没问题再统一删。比如清理日志文件很多团队的做法是先mv到/tmp或/data/backup下观察几天没问题再清理而不是直接rm完事。find命令值得单独说透。find /path -name .log是基础但真正实用的是按时间过滤find /var/log -type f -mtime 30 -name .log可以找出30天前的日志。如果是要删掉这些旧日志再把-exec rm {} ;接在后面。不过建议先查出结果确认无误再删除别急着直接拼接。批量改权限也是find常用场景find . -type f -exec chmod 644 {} ;比手动在目录里一条条改高效得多。2.2 文本处理三件套grep、sed、awk的实战视角文本处理是Linux的强项也是很多人觉得难的地方。grep、sed、awk被称作三件套但工作中大部分需求其实grep加上管道就能解决大半sed和awk是查漏补缺的利器。grep用得最多的是过滤日志。实际生产中常见的做法是grep -i忽略大小写、grep -r在目录里递归搜索、grep -v反向过滤。做日志分析的时候经常要查某个关键字的上下文这个场景用grep -A 5和-B 5特别顺手一个显示匹配行后面5行一个显示前面5行。比如查报错日志看报错信息前后的业务输出一下子就能定位问题原因。sed的核心能力是替换和编辑流文本。sed -i s/old/new/g file是网上出现频率最高的写法但有一个关键点很多人不知道macOS系统上sed -i后面需要加一个后缀参数比如sed -i 否则会报错而Linux上直接写就行了。跨平台工作时这点容易卡壳。另外sed -i虽然方便但用之前建议先备份文件命令改成sed -i.bak s/old/new/g file这样会自动生成一个file.bak备份文件。改配置文件这种操作留个备份永远是好习惯。awk是排版神器。ps -ef | awk {print $2}提取PIDnetstat -tunlp | awk {print $7}截取进程名这两个场景跟我日常工作几乎天天碰。awk默认以空格分割字段$1、$2代表第一列、第二列配合-F参数可以指定分隔符比如-F:来按冒号分割。敏感词场景里awk还能做条件过滤awk $3 100 {print $1}可以从一堆数据里过滤出第三列大于100的行这在分析性能数据的时候非常实用。2.3 权限管理chmod、chown的核心原则和避坑点权限这一块其实概念不复杂但出错的概率不小。chmod用来改权限chown用来改属主属组核心原则就一个最小权限原则。给文件和目录分配权限的时候先想一下运行这个程序的用户到底需要什么权限够用就行千万别图省事直接chmod -R 777。chmod的表示法有两种数字法和符号法。数字法里4是读、2是写、1是执行加起来得到常用的755、644、700这类值。符号法里u是属主g是属组o是其他人a是所有用户。工作里我习惯用数字法简洁明确但有一点必须提醒目录如果只有执行权限没有读权限ls是看不到内容列表的但可以直接访问已知文件名的文件。这个细节面试题里也常考理解了这个才算是真懂权限。chown的典型场景拷贝过来的文件变成了某个用户所有服务启动报权限不足。解决办法就是chown新用户:新组 -R /path/to/dir-R参数一并修改目录下所有子文件和子目录。注意如果只是改某个文件没必要加-R加了会把整目录下的其它文件都改了可能引发意外问题。2.4 打包压缩与传输tar、scp、rsync的组合用法打包压缩是运维日常绕不开的事。tar命令核心用法就几个tar -czvf打包并以gzip压缩、tar -xzvf解压、tar -tf查看压缩包内容不解压。-c是创建-x是解压-z是gzip-v是显示过程-f指定文件名。这几个参数记住了大部分场景都能应付。跨服务器传文件的时候scp是最直接的。scp file.txt userremote:/path/反向则是scp userremote:/path/file.txt ./。这个命令基于SSH所以目标机器必须是SSH可登录的端口自定义的话加-P参数指定注意是大写的P小写p是重要学习优先级和ssh的参数习惯一致。如果用rsync远程同步常用组合是rsync -avz --progress source userremote:/dest/-a保留属性-v显示明细-z压缩传输。rsync比scp强的地方在于支持增量同步第二次传只有差异部分大数据量迁移时效率天差地别。3. 实操过程与核心环节实现3.1 场景一线上CPU飙高如何快速定位这个场景是我工作中最常遇到的。应用突然变慢用户投诉接口超时上服务器一看top某个进程CPU占了几百百分比。这里“几百”的意思是top默认显示各进程占用的CPU核数100%代表一个核跑满300%就是三个核跑满。别慌按这个思路来。第一步top -o %CPU让进程按CPU占用排序找到PID。这一步的是快速的。第二步根据PID找到对应的进程信息ps -ef | grep PID确认是什么应用、什么脚本。这一步的目的是搞清楚这个“吃CPU”的是哪个程序还是说它只是异常现象的表现者。第三步如果确认是Java应用那就得抓线程栈了。top -H -p PID会显示该进程下的所有线程找到CPU最高的线程号然后printf %x\n 线程号把十进制转换成十六进制再用jstack PID | grep -A 100 十六进制线程号就能看到这个线程到底在跑什么代码。这里Java的线程号是十六进制jstack里展示的nid就是十六进制所以必须先转换。第四步如果是脚本导致的问题就简单多了看脚本日志或者用strace -p PID跟踪系统调用看看进程在反复执行什么操作。处理完问题之后记得抓一份完整的现场信息uptime、top快照、ps快照、最近日志。这些信息一方面用于后续复盘另一方面如果问题需要研发介入能提供足够证据。我见过很多同事一上来就kill掉进程结果啥信息都没有留下再出问题还得重新排查。3.2 场景二磁盘空间满了如何找出大文件并安全清理收到磁盘告警是运维最常见的事故之一。df -h能显示各分区使用情况但只会告诉你哪个分区满了具体是哪些目录占用需要进一步排查。我一般按这个顺序操作。先df -h确认哪个分区满了。然后cd到对应的挂载目录比如/data满了就进去。接着用du -sh *按目录汇总统计看单位大小注意du会很慢大数据量时用du -xh --max-depth1 /data 2/dev/null | sort -rh | head -10这样的组合能快速列出前十个大目录。sort -rh的意思是按可读数字从大到小排序head -10取前十条。找到目录之后再往下一层一层排查。最终定位到大文件之后确认是什么文件。如果是日志文件先看应用是否还在写确认停写之后可以truncate而不是rmtruncate -s 0 /path/to/file.log这个操作可以把文件瞬间清零不需要删除文件也不需要重启服务比rm安全得多。因为有些进程打开着文件rm掉之后空间不释放反而会出更多乱子。这里特别提醒一下rm删文件之后空间没释放的情况。原因是文件被已运行的进程持有句柄Linux下文件被删除但没关闭时空间其实还没释放。排查方法很简单lsof | grep deleted找到对应进程重启或者换成truncate处理。这个坑太经典了每次面试我都喜欢问。3.3 场景三网络不通如何用netstat、ss、ping、telnet缩小范围网络问题是另一个高频故障。排查顺序我习惯从自己这台机器往外走先确认本机网卡和IP是否正常ip addr或者ifconfig看一眼。然后ping网关确认二层三层通不通ping外网IP确认公网连通性。通了之后再查DNS解析nslookup或者dig看域名能不能解析最后再确认目标端口是否对当前IP开放。端口连通性检查工作里最常用的是telnet和nc。telnet ip port简单粗暴能通就进入连接状态不能通就提示失败。但telnet在部分系统默认不安装这时候nc -zv ip port可以做同样的探测。还记得有一次帮同事排查两台服务器之间的端口不通ip明明能ping通端口却怎么都连不上最后发现是云安全组没放行安全组不归操作系统管排查的方向错了就白费半天劲。本机端口监控用netstat -tunlp参数含义不解释了但实际使用时我通常配合grepnetstat -tunlp | grep 8080能快速确认端口被哪个进程占用。netstat在高连接数场景下可能稍慢ss是它的增强替代品ss -tunlp效果一样但性能更优。现在的CentOS 7以上、Ubuntu新版本里我都习惯优先用ss。3.4 场景四服务起不来查看日志的正确姿势服务起不来这件事新手和老手的排查效率差距巨大关键在对日志工具使用熟练度。常规操作是先看服务状态systemctl status xxx能看出服务当前状态和最近几条日志。如果不够journalctl -u xxx -f实时跟踪日志输出方便启动过程中边看边定位。老系统没有systemd的就直接看应用日志文件一般都在/var/log/下面。日志文件很多的时候不要一上来就cat然后肉眼找。用grep -i error logfile先粗筛再结合tail -n 100 logfile看最后几十行多数报错信息就在尾部。如果日志文件已经被轮转切割成log.1、log.2这些用zgrep去搜索.gz压缩过的历史日志不需要解压也能搜。定位到报错信息之后用sed -n 200,220p logfile这个方式指定范围查看不用打开完整文件大日志也不会卡。如果日志里有时间戳可以用sed按时间段提取。这些技巧单个看都不难组合起来非常给力。4. 常见问题与排查技巧实录4.1 一个命令快速看透服务器整体状态有时候会遇到完全不知道服务器什么状态的情况这时候我会用一个组合命令把关键信息一次性打出来。这个习惯也是被坑出来以前接手一台机器什么都得靠猜后来形成一套固定起手式。uptime看三个负载值分别代表1分钟、5分钟、15分钟的平均负载。如果15分钟负载高说明老早就出问题了不是刚发生。free -h看内存注意available才是真正可用的内存因为Linux会把空闲内存当作缓存free显示的free值偏低不代表不够用。df -h看磁盘使用率。top看实时状态q退出。这四个命令组合起来的画面是一台服务器的CPU、内存、磁盘、负载基本状态一目了然。系统维护的第一件事永远是先摸清整体再有针对性地深入乱抓一气只会浪费时间。4.2 为什么删了文件但磁盘空间没有释放前面提了一次这里把这个坑讲透。Linux的磁盘空间管理上文件是否真的被删除取决于还有没有进程持有它的文件句柄。只要进程不释放句柄文件删除操作并不会真正释放空间。这种场景经常出现在日志文件、临时文件被进程占用的时候。排查和解决流程是这样先用lsof L1或者lsof | grep deleted列出被删除但仍被占用的文件找到PID后确认进程是否正常。如果进程是核心业务不能随便重启就要考虑替代方案比如用cat /dev/null file的方式清空而不是删除这样空间即时释放而文件不会被贴上deleted标签原进程依然可以正常写。如果是非核心进程重启进程就能释放句柄。这个经验花了我不少冤枉时间当年最初处理磁盘满问题时删完文件发现df -h没有任何变化都懵了后来慢慢查到原因才算把这块的坑摸透。4.3 排查命令提示command not found的常见原因工作中还经常遇到这类情况明明用的命令网上都能查到自己这一敲却提示command not found。原因通常有几个维度每条命令我简单总结一下。一是命令没安装比如ifconfig在部分新系统上默认没有需要安装net-toolsdig需要安装dnsutils或者bind-utils。这时候两个选择要么装对应工具包要么用替代命令比如ip addr替代ifconfig。二是命令存在但不在当前用户PATH路径里。常见于手动编译安装的软件安装到了/usr/local/xxx/bin这个目录没有加入PATH。解决办法是找到可执行文件所在路径用全路径调用或者把它所在的bin目录加到PATH里。如果不想永久修改用export PATH/usr/local/xxx/bin:$PATH当前会话临时生效。三是用了root权限但工具没装sudo权限本身不能代替安装软件。我见过不少人sudo之后还是command not found就以为权限不够其实是确实没装这个命令。排查顺序建议是先用which命令名看是否找得到再用ls /usr/bin/命令名和ls /usr/local/bin/命令名确认是否安装到非PATH目录最后再考虑安装对应软件包。按这个顺序来基本都能快速定位。4.4 运维常见操作速查表最后整理一张速查表把工作里最常用的几十个操作列出来方便直接查阅。不追求覆盖所有命令只收录有实际使用频率的每个操作我都验证过可以放心套用。操作目标命令组合说明查看目录占用du -sh *需要在目标目录下执行列出最大文件du -x --max-depth1 /data | sort -rh | head -10多级目录更高效找出被删除但被占用文件lsof | grep deleted确认进程句柄清空文件但保留句柄truncate -s 0 /var/log/xxx.log安全释放空间按关键字过滤日志grep -i error app.log忽略大小写查日志上下文grep -A 5 -B 5 error app.log前后各5行实时追踪日志tail -f app.logCtrlC退出查看端口占用ss -tunlp | grep 8080比netstat更快测试端口连通nc -zv 192.168.1.10 3306可用于ping不通场景打包目录tar -czvf backup.tar.gz /data/app/常用备份方式解压到指定目录tar -xzvf backup.tar.gz -C /opt/-C指定位远程拷贝scp -P 2200 file userhost:/path/-P指定SSH端口增量同步目录rsync -avz /data/ userhost:/data/只传差异批量替换文件内容sed -i.bak s/old/new/g file自动生成备份查看进程树pstree -ap | grep java快速看父子进程修改文件属主chown user:group -R /data加-R递归处理这张表算是我平时的速查卡需要的时候扫一眼基本不会卡壳。4.5 聊聊命令记忆方法最后说说记忆这件事。不要死记硬背命令不是拿来背的是拿来用的。我记命令的方式是每次用到一个新命令就自己造一个场景把它敲三遍以上。比如学了ssh端口参数就专门找一台改过端口的机器连一次。学了rsync就把一个目录同步到备份目录里跑一回。用了忘、忘了查、查了再用次数多了自然就记住了。还有一个小技巧每个命令多用Tab补全一方面能少敲很多字符更重要的是Tab补全本身就在帮你验证命令拼写对不对。参数记不清的时候tabtab很多命令都会列出可用选项。练熟了整套流程效率提升不只是节省敲键盘的时间更是少做很多无用功。这个内容后续其实还可以扩展很多方向比如把常用命令写成自己的脚本工具集把复杂的排查流程固化下来一条命令完成多个步骤。根据我个人的经验从会敲单条命令到形成自己的维护工具箱中间就差这么一层沉淀。