
很多人第一次打开Linux终端面对那个黑底白字的窗口心里其实有点慌。满屏的英文指令也不知道该敲什么更不敢乱敲生怕一个回车下去系统就没了。但用久了你会发现Linux的命令并不需要像背单词一样去记真正高频的场景翻来覆去就那几类——文件操作、系统状态、文本处理、网络排查。这篇文章我就结合自己在生产环境里实际敲过的命令、踩过的坑把Linux系统中最常用也最实用的指令一次性理清楚希望刚入门的朋友能少走点弯路已经上手的同学也能在细节上有所收获。1. 文件与目录操作越基础的命令越值得抠细节1.1 列目录也不简单ls 的各种组合用法很多人用ls就只会敲一个裸的ls然后看到一堆名字挤在那里。其实ls是这个系统里最值得多花两分钟熟悉的命令因为它承载了你每天进入任何目录之后的第一次信息获取。我最常用的组合是ls -l也就是 long format长格式输出。它会告诉你每个文件的权限、属主、属组、大小、最后修改时间还有文件名。ls -la则是在-l的基础上加上a显示隐藏文件。很多配置文件都是以点开头的比如.bashrc、.ssh不加a你是看不到的。还有一个组合可能很多人没注意到ls -ltr。这里的t是按文件修改时间排序r是反向合在一起就是按修改时间从旧到新排列。这个用法在做日志目录巡查的时候极其好用因为你要找的往往就是最新产生的日志往列表最下面一看最新文件就在那里。比如进入/var/log之后直接ls -ltr马上就知道哪个日志最近在更新、哪个已经不动了。ls -ld也值得一提。d表示只显示目录本身的信息而不是目录里的内容。当你执行ls -l /opt/app时你看到的是/opt/app里面的文件但如果你想知道/opt/app这个目录本身的权限对不对就要用ls -ld /opt/app。1.2 目录切换和路径管理cd 和 pwd 的细节cd应该是最没有技术含量的命令了但这里有两个小技巧非常实用。第一个是cd -。这个命令会切换到你上一次所在的目录相当于一个回退键。我在处理多层路径嵌套、需要在两个项目目录之间来回操作时就是靠这个命令省掉了大量重复输入。第二个是cd ~或者直接裸敲cd会回到当前用户的家目录。配合/根目录、.当前目录和..上级目录这几个路径概念基本上日常目录切换就全覆盖了。pwd是打印当前工作目录很多人觉得它没什么用。但在写脚本、配定时任务、排查环境变量问题的时候pwd能帮你快速确认自己到底在哪个路径。我自己有一个习惯只要在一个新的会话里要操作重要文件必先pwd确认一次防止在错误目录里执行后面的命令。1.3 复制、移动、删除的安全操作姿势cp、mv、rm这三个命令是刚学Linux时最容易出事的地方。先说cp如果你要复制整个目录必须加-r递归复制如果嫌以后麻烦直接用cp -a它能在递归的基础上把权限、时间戳这些属性一起保留。这个-a在实际备份时非常有用因为它保证复制出来的东西和原件几乎一模一样而不仅仅是内容相同。mv看似简单它既可以移动文件也可以重命名文件。在生产环境里我更倾向于用mv来做一种软删除不确定一个文件能不能删的时候先mv到一个临时目录确认系统运行正常之后再去清理。比起rm这是一种温和得多、也可恢复的操作方式。rm是重点中的重点。裸rm和rm -rf的区别相信每个人都听过但我还是想多说一句rm -rf里那个f代表 force不提示直接删r代表递归连目录带子文件一起删。两个参数加在一起再加上你路径写错就是生产事故的经典配方。所以我有几条铁律在重要的机器上给rm设置一个别名让它变成rm -i每次删除都会先问你一句。删除之前先ls确认路径存在且内容确实是你想要删的。能先mv到/tmp就先不要rm。rm -rf /这种灾难性操作我实际没遇到过但见过有人把空格打错导致删错了项目目录。建议大家在练习环境里多感受几次rm -i和rm的交互差异形成肌肉记忆。1.4 查找文件和磁盘占用find、du、df 的配合找文件用find这是很多新手容易忽略但生产环境里几乎天天要用的命令。最基本的用法是按名字找find /opt -name *.log在所有 /opt 下找后缀是 .log 的文件。再加个-type f可以只匹配普通文件排除目录。find还支持按时间过滤-mtime 7表示修改时间在7天以上的文件。如果你想找最近一天内刚改过的文件就是-mtime -1。这里有个容易踩坑的点find配合-exec和配合xargs的区别。-exec rm {} \;这种写法是每找到一个文件就执行一次 rm速度慢但比较直观。更高效的是find ... -print0 | xargs -0 rm这种管道写法一次批量删除而且用-0和-print0配合能处理文件名里带空格的情况。我建议先把-exec学会等理解了之后再切换成 xargs 提速。磁盘占用排查是 Linux 运维里最常见的需求之一。df -h可以看整个系统各个分区用了多少-h表示用人类可读的方式显示 G、M 这种单位。而du是看某个目录的实际大小du -sh *会列出当前目录下每个子目录和文件的总大小哪个目录占了几百G一目了然。排查思路通常是先用df -h找到快满的分区再进对应目录用du -sh *从大到小逐层定位最后用find或ls确认具体是哪些文件占的。一套组合拳下来磁盘问题基本都能锁定。2. 系统状态与进程排查看到问题怎么定位2.1 登机第一件事uptime 和 load average我每次登录一台 Linux 服务器第一件事就是执行uptime。它会在输出里告诉你当前时间、机器已经运行多久、当前登录用户数以及最近 1 分钟、5 分钟、15 分钟的负载平均值。很多新手看到 load average 三个数字就发懵。你可以把负载理解成在这段时间里有多少任务在排队等着被 CPU 处理的综合指标。如果服务器 CPU 核数是 4那负载长期在 4 左右说明每个核都有活干系统满载但还算稳定如果负载到了 20 而 CPU 只有 4 核那说明有大量任务在排队机器已经明显过载了。要结合 CPU 核数来看负载不要孤立地看数字。另外第三个数字15分钟平均值比第一个数字更能反映系统长期状态因为它代表了相对稳定的趋势。2.2 top 的批处理用法和进程视图top是一个交互式命令进去之后就占了整个终端。它上半部分显示系统整体状态包括负载、进程数、CPU 使用率、内存使用情况下半部分是当前占用资源最高的进程列表。在里面可以直接按P按 CPU 占用排序按M按内存占用排序按q退出。但在脚本和实践自动化场景里我们更多用top -bn1-b是批处理模式不会进入交互界面-n1是只执行一次。这个输出可以直接给别的命令做二次处理比如抓出 CPU 占用最高的进程。我再强调一个小技巧top -bn1 | head -20可以只查看前 20 行避免整个屏幕刷出太长内容。进程状态里有一个需要注意的状态叫Z也就是 zombie僵尸进程。僵尸进程已经死掉但由于父进程没有回收它所以一直占着一个进程表项。偶尔一个僵尸进程不用太紧张但如果数量持续增加通常说明某个父进程的状态不正常需要找到那个父进程去看原因。2.3 ps 两大家族aux 和 -ef 的差异ps用来查看进程Linux 里有两套风格一套叫 BSD 风格一套叫 Unix 风格。最常用的分别是ps aux和ps -ef。ps aux输出里有一个很有用的列叫 STAT它是进程状态标志ps -ef的输出里则有 PPID也就是父进程 ID这在排查进程血缘关系时很好用。两套命令查出来的关键信息基本相同只是格式侧重不同。新手不用纠结哪个更好两个都记住见到哪个都能读就行。查进程时最常见的组合是ps aux | grep xxx。但这里有个经典坑grep命令本身也会出现在结果里因为它在搜索包含xxx的同时自己的命令行里也包含了xxx这几个字符。解决方法是grep后面加一个[x]xx这样的正则技巧或者用grep xxx | grep -v grep把 grep 自己排除掉。我第一次见到[x]xx这种写法时觉得挺巧妙本质就是让你要搜的关键字符当中有一个被框起来它照样能匹配但 grep 进程自身的命令行里就不完全匹配这个模式了。pgrep是一个更推荐使用的工具pgrep -f ssh可以直接返回符合条件进程的 PID完全绕开了刚才那个自匹配问题。配合kill使用非常顺手。2.4 内存、缓存和日志别被表面数据吓到free -h是看内存的命令。这里有个非常常见的误解看到 used 的数字很大、free 的数字很小就觉得内存不够了。实际上 Linux 的内存管理机制会尽量利用空闲内存做缓存这部分用buff/cache标记。当某个应用程序真正需要内存时这些缓存会被释放出来给应用用。所以判断内存是否紧张更该关注的是 available 那一列它表示估算有多少内存是可以直接分配给新程序的。系统日志也是排查问题的重要入口。dmesg用来查看内核环形缓冲区消息硬件故障、磁盘 I/O 错误往往在这里有记录。到了 systemd 时代journalctl逐渐取代了传统日志查看方式journalctl -u后面加服务名可以看某个服务的所有日志格式上还带时间戳确实比在/var/log底下翻文件方便了不少。不过像/var/log/messages这种传统日志文件依然存在于大量老系统中不能完全不懂。2.5 kill 的正确姿势先温柔后暴力kill命令的本质是向进程发送信号不是杀进程。最常用的是kill -15默认就带 -15也就是告诉进程请你优雅退出让进程自己处理收尾工作。当进程不理会这个请求或者它本身出问题无法响应时才会用到kill -9强制由内核直接终止它。-9这个信号不能被进程捕获等于是直接拔电源。我在排查故障时有一条基本顺序先用kill或kill -15看看进程是否真的退出等几秒再检查进程列表确认无效后才考虑kill -9。一上来就kill -9虽然快但可能让进程来不及写缓冲数据、来不及清理临时文件留下一些隐藏后患。3. 文本处理三件套grep、sed、awk 的高频组合3.1 grep过滤日志的必备基本功grep的作用是在文本中按模式匹配行。最基本的grep error app.log会输出 app.log 里所有包含 error 的行。加上-n可以同时显示行号-c可以只输出匹配到的次数-i忽略大小写。用到生产日志排查时光有精确匹配往往不够。grep -E代表扩展正则比如grep -E error|exception|timeout app.log可以一次性匹配多个关键词grep -v是反选把不包含特定内容的行显示出来比如先剔除无意义的 DEBUG 行grep -A 5和grep -B 5则分别显示匹配行之后和之前的5行这个看异常堆栈特别好用能把异常上下文一并捞出来。有一个小坑日志文件很大直接 grep 一个常见词会刷出几万行。这时候建议先grep -c数一下大概有多少行匹配再决定要不要进一步缩小范围而不是一头扎进海量输出里。3.2 sed不要只会看要会改sed的看家本领是对文本做编辑操作它在命令行领域最强的功能就是替换。基本命令是sed s/旧文本/新文本/g 文件名其中s表示替换g表示这一行的所有匹配处都替换而不是只替换第一个。注意这个命令默认只是把替换结果输出到屏幕并不会改原文件真正要改回原文件需要加-i参数sed -i s/旧/新/g。给-i加一个后缀可以生成备份文件比如sed -i.bak s/old/new/g config.conf它会在修改之前先保存一份 config.conf.bak。我特别推崇这个习惯因为一旦发现替换结果不对还能马上恢复。有一回我在线上改配置用sed -i直接改结果正则写错了把一个字段名改成了残缺状态幸好当时习惯性地加了.bak几秒钟就回滚了不然那次可真要手忙脚乱。除替换外sed经常和-n一起用配合p来打印指定行。比如sed -n 10,20p /var/log/app.log就是只显示第10到第20行在查看超大日志文件的某个段落时非常有价值。3.3 awk按列切割和统计的利器awk是文本处理三件套里上限最高的一个。它的默认行为是按空白空格或 Tab把一行切成多列第一列叫$1第二列叫$2依此类推$0是整行。最简单的场景日志格式是时间 级别 内容你只想知道每条日志的级别awk {print $2}就能把第二列全部摘出来。配合-F可以指定分隔符。比如很多日志用逗号或竖线分隔awk -F, {print $1}就是按逗号切分。awk还支持条件过滤awk $3 500 {print}会只输出第三列大于500的行它还有NR当前是第几行和NF当前行共有几列两个内置变量这两个在格式化输出时太常用了。生产环境里我经常用 awk 做简单统计。比如日志里有一列是响应时间我想算所有请求的平均响应时间可以用awk {sum$NF; count} END {print sum/count} app.log。END块表示所有行都处理完之后执行一次配合累加和计数就是一个很实用的平均统计器。类似的思路还可以统计某个关键词出现的次数、按某个条件汇总总量都能在命令行直接完成不需要把文件下载到本地再用 Excel 处理。3.4 三件套组合实战从日志里捞问题说了这么多来个组合案例。假设 app.log 里有这样的格式[2024-11-20 10:15:03] ERROR 192.168.1.10 user_login timeout我想找出今天所有 ERROR 行里来源 IP 的分布再看看哪个 IP 报错最多。第一步先按日期和级别过滤grep 2024-11-20 app.log | grep ERROR。第二步用 awk 提取第四个字段也就是 IPawk {print $4}。第三步排序统计计数sort | uniq -c | sort -rn。uniq -c的作用是合并相邻的重复行并统计次数所以前面一定先要sortsort -rn的-r是反向排序-n是数字排序让次数最大的排最上面。一条完整的命令就是grep 2024-11-20 app.log | grep ERROR | awk {print $4} | sort | uniq -c | sort -rn。这就是日志分析的经典管道链也是我觉得最能体现 Linux 命令魅力的场景——不需要装任何分析软件几条命令拼接起来就能得到答案。熟练之后你会越来越依赖这种组合方式因为它实在太快了。4. 网络与存储诊断命令不在多会找问题才行4.1 网络地址和端口ip 与 ss 时代的姿势老一代教程里讲的ifconfig和netstat在现在的很多发行版里已经不再默认安装了它们被ip和ss取代。ip addr看本机 IP 地址ip link看网卡状态ip route看路由表。这些命令的参数确实和老的 ifconfig 不一样但逻辑更清晰输出也更结构化。查看端口监听和连接状态ss -tunlp是个极好的命令。-t表示 TCP-u表示 UDP-l表示只显示监听中的端口-n是不要反解域名-p是显示对应的进程。当你想知道8080 端口到底被哪个服务占着ss -tunlp | grep 8080是标准答案。我刚工作时习惯用 netstat后来发现在新系统里经常提示命令不存在切换成 ss 之后就再也没回去过因为它不仅默认自带输出速度也快很多。4.2 连通性测试ping、curl 和 DNS 查询ping用来测一个地址通不通ICMP 协议层面的探测。但它有几个边界要知道很多服务器会禁 ping防火墙会丢弃 ICMP 包所以 ping 不通不等于服务不可用反之 ping 得通只代表能到达那一层网络不代表应用端口正常。我在排查时把 ping 当成第一层筛查更深入的还要看端口和应用层。要快速验证一个 HTTP 服务是否正常curl是我的首选。命令本身只是个数据传输工具但它附带的能力极适合做接口探测。curl -I http://localhost:8080只拿响应头能看到状态码curl -v会打印整个请求和响应的详细过程包括证书信息、HTTP 头、重定向路径这些对排查接口问题非常直观。想模拟 GET 之外的请求可以用-X POST想带数据用-d想看耗时还能加-w %{time_total}。这一条 curl 命令顶得上半个接口测试工具。DNS 排查常用dig或nslookup。域名解析不出结果或解析到错误 IP 时先用dig 8.8.8.8 域名指定一个公共 DNS 服务器来排除本机 DNS 配置问题是效率很高的做法。这个场景在云上和办公环境里都很常见。4.3 磁盘挂载和存储问题df -h前面提过是看分区使用率的。但还有一个被很多人忽略的命令是df -i它检查的是 inode 的使用率。inode 是 Linux 文件系统用来记录文件元数据的结构当你创建了大量小文件时inode 可能先被耗尽这时即使磁盘还有空闲空间系统也会报 No space left on device 错误。这个坑的隐蔽之处在于df -h看起来明明还有几十G但新文件就是写不进去。我有一次排查写不进文件的问题花了不少时间最后发现就是/tmp目录里堆积了海量小文件导致 inode 耗尽df -i一查就现形了。挂载新磁盘时mount命令是核心。mount -t ext4 /dev/sdb1 /data这种格式要记住但更重要的是要在挂载之前意识到文件系统类型、设备名称要匹配挂载之后用df -h或lsblk来验证。lsblk是个很直观的工具它以树状列出所有块设备挂载点一眼就能看出来。4.4 查看实时连接和带宽网络排查的进阶当服务响应慢疑心是网络问题或者连接数满了的时候可以用ss -s看看当前所有连接和套接字的汇总信息留意 TIME_WAIT、ESTABLISHED 的数量。如果 TIME_WAIT 数量异常高通常会伴随端口耗尽或性能下降这个在长连接服务里比较常见。带宽测速的临时工具我一般用iperf3。一端起服务端iperf3 -s另一端跑客户端iperf3 -c 对端IP几秒钟就能测出两点之间的实际传输带宽。这种手段在跨机房迁移、云上带宽质疑的场景里特别有价值能用数据来消除争论而不是靠感觉判断是不是网络卡了。5. 效率升级别名、历史、前后台与权限管理5.1 用 alias 把常用命令缩短把危险命令加锁alias是一个 shell 内建功能用来给命令起一个更短的名字。我几乎在任何一台工作机上都会配这么几行alias llls -l alias lals -la alias grepgrep --colorauto最值得推荐的 alias 是把危险命令加上确认提示alias rmrm -i设置之后再执行rm删除文件时系统会逐个询问确认这算是我信赖的一道防线。要注意的是 alias 默认只在当前会话有效要永久生效就得把它写进~/.bashrc这样的配置文件然后执行source ~/.bashrc或者重新登录来加载。5.2 history上下翻页之外的高级用法按键盘上的上方向键翻历史命令是最原始的方式。配合history命令本身能看到完整的命令编号和历史记录。真正高效的是几个快捷方式!!表示上一条命令。如果你是sudo身份执行时提示权限不足可以sudo !!直接把上一条命令用管理员权限再执行一遍。!$表示上一条命令的最后一个参数。例如你先执行cat /etc/nginx/nginx.conf随后想编辑它就可以直接vim !$。Ctrl R进入反向搜索输入几个字母shell 会帮你从历史记录里匹配相近的命令回车即可执行。用得多了之后我几乎很少靠肉眼翻历史记录。history 还有一个安全注意点它默认会记录大量命令包含密码、密钥信息的命令可能会泄露到历史文件里。不要在命令行直接传密码参数这个习惯值得养成。5.3 任务前后台切换与 nohup在终端里执行一个耗时任务但又不想一直等在那里可以把这个任务放到后台去。基本流程是这样的执行命令时在末尾加一个命令会直接放到后台运行同时给你返回一个任务号。如果你已经开始执行了才发现要等很久按下Ctrl Z可以把它暂停暂停后执行bg会让它转为后台继续跑。jobs可以列出当前 shell 的所有后台任务fg可以把指定的后台任务拉回前台。但这里有个坑用起的后台任务在你关掉终端的时候可能会收到挂断信号直接被杀掉。如果你希望任务在你退出之后继续运行就要用nohupnohup 你的命令 日志文件 21 。这个命令翻译成大白话就是不接电话断开也不挂断。我把这三段链路讲清楚你能明显感受到 shell 的任务管理是很灵活的。实际生产中跑一些长脚本、临时起个服务、挂一个数据同步任务这些技巧几乎天天用到。5.4 权限与属主chmod、chown 避坑指南chmod用于修改文件权限数字表示法chmod 755是最通俗的。755 里的三位数字分别代表属主、属组、其他人的权限7 是读写执行5 是读执行所以 755 就是属主全权其他人只读和执行。目录的默认权限经常是 755普通文件常用 644。chown用于修改属主和属组常见格式是chown 用户名:组名 文件。改文件归属的一个高频场景是部署新项目以后Web 服务进程跑在某一个专用用户下需要把代码目录 chown 给那个用户否则进程无法读写。特别想提醒的是chmod 777这种权限给法。很多教程为了让问题快速被解决直接让人 777但生产环境里这就是给恶意行为开了一扇门。宁可多花点时间想清楚这个文件/目录需要哪些用户可读可写可执行也不要图省事全部放开。权限永远是最小够用原则。5.5 我的日常命令清单按场景速查最后我把这些命令按应用场景归成一个小清单方便你日常翻阅场景常用命令查目录状态ls -ltr、ls -ld看磁盘使用df -h、df -i、du -sh *找文件find /path -name *.log找大目录du -sh * / sort -h看系统负载uptime、top -bn1查进程ps aux内存状况free -h看端口ss -tunlp接口探测curl -I、curl -v文本过滤grep -E、grep -v、grep -A -B文本替换sed -i.bak s/old/new/g按列处理awk {print $1}、awk -F,后台任务nohup cmd log 21 历史命令!!、!$、CtrlR这个清单本身就是一个很好的练习册每一项都是我在真实操作中反复用到的。建议你把每个命令都亲手跑一遍把单条命令吃透之后再尝试把管道和多命令组合起来这样用起来才会真正形成肌肉记忆。我在实际使用中最深的感受是Linux 的命令学习没有捷径但它也绝对不是什么高难度的事情。你不需要背着几十条命令死记硬背只需要把自己放进真实的场景里——文件找不到了就搜 find日志刷得太快就学 grep端口被占了就查 ss。每一个需求都会向你展示它对应的那条命令次数多了这些命令自然就长在你身上了。最重要的是每次操作之前多想一步确认路径、确认参数、确认影响范围这比多记十个命令更能保护你的生产环境。