恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
Linux高频命令实战:文件操作、文本处理与系统排查全解析
首页
资讯中心
/
Linux高频命令实战:文件操作、文本处理与系统排查全解析
Linux高频命令实战:文件操作、文本处理与系统排查全解析
发布时间:2026/10/20 4:20:56
接触 Linux 的环境头两周大概是最劝退的。Windows 和 macOS 给人留下的惯性太强了双击、右键、复制粘贴鼠标点点点突然换成纯命令行操作很多人第一反应是“这玩意儿到底怎么用”。我自己当年也是这样打开终端满屏的英文命令不知道该敲什么怕敲错一个字符就搞出大事。但坚持用下来之后你会发现这些命令其实并没有想象中那么神秘它们背后就是一套很朴素的逻辑找文件、看内容、改权限、管进程、查网络。这篇文章我打算把 Linux 常用命令里真正高频、真正解决日常问题的部分拆开揉碎讲一遍不整那些一个月都用不上一次的冷门参数只讲你在实际干活时躲不开的那些以及我踩过的坑和总结出来的小技巧。不管你是刚装好 Linux 发行版的学生还是工作中要接管服务器的新人这一篇应该都能帮你在命令行里少走不少弯路。1. 文件与目录操作先从最常用的命令练起1.1 ls 的常用参数组合与输出解读ls 大概是每个人学会的第一条命令。但很多人用了一年还是只会 ls 回车一下。实际上ls 是你观察文件系统最直接的窗口把这个命令的参数吃透你等于给自己装了一个“文件系统透视镜”。先说最实用的组合ls -lh。-l是用长格式显示-h是 human-readable把字节数自动转成 K、M、G 这种单位。我见过不少新手敲ls -l之后看着一列 4096 发呆那是字节数换算一下就是 4K。加上-h之后一眼就能看出来哪个日志文件已经膨胀到几个 G。还有一个很容易被忽略的是ls -lt按修改时间从新到旧排序。排查问题的时候你想知道哪个配置文件最近被动过这个命令直接给你答案。如果再补一个-r变成ls -ltr那就是按时间倒序老文件在下面、新文件在上面看日志目录的时候特别顺手因为最新写入的文件永远排在最后你只需要盯住末尾几行。然后是关于隐藏文件的坑。很多人以为ls -a里的 a 是 all这个理解不算错但它显示的是包括以点开头的隐藏文件在内的所有条目。问题是-a会把.和..这两个特殊目录也列出来看着别扭。更干净的做法是ls -A既不显示这两个点又能把隐藏文件露出来。我平时用的默认别名是llls -lhA兼顾了长度、单位、隐藏文件还不至于被两个点占掉一行。还有一个细节容易让人困惑为什么文件权限那串字符里有-rw-r--r--第一个字符是 d 还是 -。第一个字符其实在告诉你类型d 是目录- 是普通文件l 是软链接。如果你想在目录里区分普通文件和子目录直接ls -F可以让目录名后面自动带个/找起来一目了然。这类信息不在ls的输出里做个标记等你用 find 或者 grep 去筛的时候就明白这一步的可视化有多重要了。在实操中我真正养成习惯的是ls结合通配符。比如你只想看某个目录下的压缩包ls -lh *.tar.gz这个写法在清理历史备份时特别好用。再有就是ls -d */这个组合能只列出当前目录下的子目录名而不会连目录里的内容一起倒出来。很多人不知道ls */会把每个子目录里的东西全部展开输出瞬间变得一坨乱。加一个-d就干净了只显示目录本身。1.2 cp、mv 的进阶选项与常见误用场景cp 和 mv 是复制和移动看起来没什么好讲的但实际用起来翻车率高得惊人。先说 cp核心选项排在第一位的是-r复制目录必须递归单文件不需要。我见过有人复制一个目录忘加-r系统直接回一句cp: omitting directory他愣在那里不知道发生了什么。这还算好的最怕的是复制大目录跑到一半停了你 CtrlC 之后留下一堆半截文件。所以我现在复制重要目录习惯加-a这个选项等价于-dR --preserveall能保留权限、时间戳、软链接这些属性。简单说cp -a是“原汁原味复制”而cp -r只保证内容不丢属性概不负责。说到 mv它最妙的一点是同一文件系统内移动比复制再删除快得多因为本质只是改一下指针。很多人问我把服务器上几个 T 的数据换个目录为什么 mv 一下瞬间就完了原理就在这。但跨磁盘的 mv 就会退化成真正的复制再删除你看到电脑在那里磨磨蹭蹭传输别慌这是正常的。另外 mv 覆盖文件前不会打招呼同样的问题你有同名文件mv a.txt b.txt不会问你“是否覆盖”直接就地替换。我需要确认的时候会先ls b.txt看一眼或者干脆用mv -i让它在覆盖前问你一下。这个习惯在写脚本来回搬运文件时非常有用避免手滑把正经文件盖掉。再讲一个实用的场景——批量重命名。也许你第一反应是 rename 命令但很多发行版默认带的 rename 语法版本还不一样写起来容易出错。我的土办法是先用 ls 把当前文件名全列出来然后逐个mv oldname newname。文件少还能忍多了还是用循环更稳比如for f in *.jpg; do mv $f ${f%.jpg}_backup.jpg; done。这里面${f%.jpg}的写法是从文件名尾部去掉.jpg后缀再拼上新的后缀和前缀。写这种命令的时候变量一定加双引号路径里有空格就会否则拆成两个词命令行为直接扭曲。这个坑我刚写脚本时踩得特别惨一个含空格的目录名让我整个命令全部失败。# 批量给 jpg 文件加 _backup 前缀的示例 for f in *.jpg; do mv $f ${f%.jpg}_backup.jpg done还有一个老生常谈的操作习惯删除文件不手软、复制覆盖要谨慎。rm 的-rf组合是很多事故的源头它不检查权限细节、不进入回收站删了就没了。网上经常看到“删库跑路”之类的梗笑归笑真碰到了就哭了。我现在强制自己执行 rm 之前先ls -l看一遍目标确认路径没错再回车尤其是带/结尾的路径输错一个空格就有可能是另一个世界的事情了。2. 文本处理grep、sed、awk的日常场景组合2.1 grep从简单匹配到组合过滤Linux 世界有一个说法一切皆文件而人类读文件靠的是 grep。它从一个或多个文件里筛选出符合正则的行这是它最核心的能力。只讲简单的grep keyword file是不够的实际工作里你会碰到日志文件几十万行、配置项散落各处这个时候单纯的关键词搜索远不能满足需求。第一个要掌握的升级项是grep -r。它递归搜索目录配合-n显示行号定位代码或配置出处特别好用。比如你想知道某个配置项在哪个文件里定义直接grep -rn listen_address /etc/一行命令把相关的文件路径、行号全列出来比一个一个文件翻高效太多。如果搜出来的结果太多你只想看匹配到了什么东西而不用看整行上下文可以加-o只输出匹配到的部分。这个参数在从一大段文本里提取 IP、端口、版本号时相当好用我经常用来快速拉出日志里所有出现过的 IP再排序去重看来源。再一个实际项目中的常用组合是grep -v反向过滤把不匹配的行留下来。看日志时总有那么几类无关紧要的报错反复刷屏比如健康检查的 200 响应、定时任务的状态你想跳过它们看真正的问题grep -v healthy app.log就能把这些噪音过滤掉。-A和-B是显示上下文行数grep -B 2 -A 5 Exception app.log可以把异常出现前两行和后五行一起打出来这个对排查堆栈信息和前后状态很有帮助。做过滤组合时我自己最常用的套路是管道套管道。cat app.log | grep ERROR | grep timeout | grep -v health这个写法看起来笨但每一步都在过滤最后拿到的基本就是我们真正关心的错误线索。有朋友问我为什么不直接写一个复杂的正则一次搞定我的看法是管道是逐步收窄的思路每一步都直白、所见即所得出错了也知道在哪一步过滤错的而写一个超长的正则在线上环境里没有调试机会报错了你很难回溯逻辑。真实场景下可维护性比炫技重要得多。2.2 sed流式编辑的核心操作sed 是 stream editor流编辑器。我第一次听到这个名字时完全没概念后来才明白它可以像流水线一样逐行处理文本而不像 vim 那样需要打开整个文件等着人慢慢改。对运维和开发来说最常用的功能就是“替换”和“删除”。替换的语法沉淀成一个动作sed s/old/new/g file。s 是 substitute 替换old 是被替换的内容new 是新内容末尾的 g 表示全局替换不加 g 的话一行里只替换第一个匹配项。实际工作中我常常拿它来批量修改配置文件里的 IP 或端口。比如有 20 台机器的配置里都写着192.168.0.101想统一改成192.168.0.102你不会拿 vim 一台台打开改吧sed -i s/192.168.0.101/192.168.0.102/g *.conf一把梭搞定。注意这个-i它表示原地修改文件如果不加的话sed 只是把处理后的内容打到屏幕上文件本身没变。我在给新手演示时总强调先不加-i跑一遍确认输出结果没问题再加-i执行真正的修改。这相当于给高危操作加个“预览”比直接动手要稳得多。如果你的替换内容里包含/比如要替换路径/var/log/messages为/var/log/syslog直接用/作分隔符会写得特别累赘sed s/\/var\/log\/messages/\/var\/log\/syslog/g。这时候可以换分隔符比如用#sed s#/var/log/messages#/var/log/syslog#g读起来舒服很多。sed 的分隔符理论上可以是任意字符只要你在 s 后面跟上它就行。这是很多参考文档不会特意讲的小技巧但实际使用频率很高。删除行的用法是d命令sed 3d file删除第三行sed 10,20d file删除第十到第二十行。有人会拿它来清理配置文件里的注释sed /^#/d file把以#开头的注释行全部删掉。不过这里有个隐患不是所有以#开头的都是注释你要是处理 YAML 文件#开头的一般是注释没错但有些行里#出现在中间甚至出现在字符串里这种粗暴的过滤可能会误伤。所以我更喜欢先打印预览再决定是否真的用-i保存。还有一个和 grep 配合的骚操作把某个标签之间的内容抽出来。比如你有一个 HTML 文件只想看body到/body之间的内容可以写sed -n /body/,/\/body/p。这里的-n是抑制默认输出p是打印匹配区间的行。这种区间模式在提取日志片段、提取配置块时非常实用属于 sed 比较高级的用法但一旦掌握就能解锁很多以前要写脚本才能干的事。2.3 awk处理结构化字段的利器awk 是我认为用起来最“爽”的命令因为它天然就是把每一行分成字段来处理特别适合对表格化数据做筛选和重新排版。常见场景是处理命令的输出结果比如df -h显示磁盘信息你不想看表头和人名冗长的挂载点解释只想挑出使用率超过 80% 的磁盘。awk 可以很优雅地完成这件事。基本语法不复杂awk {print $1, $3}$1是第一列$2是第二列依次类推默认字段分隔符是空白。比如awk {print $1} /etc/passwd可以快速把用户名列抽出来。如果你想把它和 cut 做比较awk 的优势在于它能在字段之间做逻辑判断比如df -h | awk $50 80 {print}这里$5是使用率那一列加了个0是为了把百分比字符串转成数字再比较否则字符串比较会出现 9% 大于 80% 这种荒谬结果。这个0的细节我第一次用的时候没想到后来排查了半天才发现是字符串比较的坑。awk 里的变量和内置函数也能辅助更复杂的需求。NR是行号NF是当前行的字段数。比如你想打印一个文件里每隔一行的内容或者想统计一个文件的总行数直接awk END {print NR} file就搞定了比wc -l的语义还直观一些因为 awk 在处理完所有行之后还能做收尾统计。而 NF 的典型用法是把空行过滤掉或者检查每一行的字段数是否一致比如 CSV 文件有的行多一个逗号字段数不对用awk NF ! 5 {print NR: 字段数量不对}能把脏数据的行号标出来。很多人一听 awk 就觉得难因为它像一门微型语言。但我建议你不要把 awk 当成一门完整语言去学只需要掌握四个切片取字段、逻辑判断、BEGIN/END 初始化与收尾、内置变量。这四个切片覆盖了日常 80% 的需求。等你写多了之后自然就会发现 awk 配合 grep 和 sed 能组成一套完整的文本流水线可以在一行命令里完成过滤、替换、重排输出的整个链路。# 示例提取系统日志中 ERROR 行的日期、时间和进程名 grep ERROR app.log | awk {print $1, $2, $3, $5}3. 文件查找与权限管理find与chmod的使用心得3.1 find按文件名、时间、大小组合查找当你管理过一台跑了几年的服务器之后文件散落程度绝对超出想象。这个时候记忆文件位置不靠谱find 是你唯一可以信任的搜索工具。它的能力远超 CtrlF因为你不是在一个文件里找而是在整个目录树上找符合条件的文件。最基本的用法是find /path -name *.log在指定路径下按名字匹配。很多人在这里会忽略引号直接写find . -name *.log如果不加引号Shell 会把*.log先展开成当前目录下所有以 .log 结尾的文件名然后 find 拿到的是这一堆具体文件名逻辑就完全不对了。所以我的习惯是涉及到通配符的参数一律加单引号或双引号让 find 自己去做匹配而不是让 Shell 提前展开。这个细节导致过搜索结果神秘为空排查半天才发现是 Shell 展开的锅。按时间查找是 find 另一大杀器。find /var/log -mtime -7 -type f能列出最近七天修改过的普通文件。这里的-mtime以天为单位-mmin以分钟为单位。实际排障时我想知道哪个文件刚被动过用find /etc -mmin -5会非常直接。比如怀疑有程序悄悄改了配置文件这条命令能立刻锁定嫌疑对象。如果还要按文件大小找-size 100M是大于 100M 的文件-size -1G是小于 1G 的文件配合清理磁盘非常实用。find 的-exec是很多人觉得高级的地方。它的作用是搜出来的结果自动传给后面指定的命令处理。比如想把 /tmp 下所有 .log 文件删掉find /tmp -name *.log -exec rm -f {} \;。这里{}是每个搜索结果的占位符\;是命令结束符。这种写法能把“搜索”和“动作”一步完成免去先把结果缓存再手动处理的麻烦。但也要注意-exec对于大量文件来说会为每个文件启动一个命令进程效率不见得高。文件数量多的时候我更喜欢find /tmp -name *.log | xargs rm -fxargs 会批量把结果分给后面的命令快很多但文件名里有空格就麻烦得配合-print0和-0参数使用。两者各有适用场景我一般按文件数量和名称复杂度来选择。还有一点find 默认会进入子目录递归查找如果你只想在当前层找而不深入子目录加-maxdepth 1。这个参数非常提效特别是搜索大目录的时候不想无限递归拖慢系统限制深度是一个好习惯。同理-type f和-type d的过滤也很常用因为很多时候你只想找文件不想被一堆同名目录干扰。3.2 chmod的权限设置思路与常见坑Linux 的权限模型是很多东西安全性的基础。chmod修改权限它有两种模式符号模式和数字模式。很多人学的时候记住了chmod 755这个经典组合但没有真正理解 755 是什么意思。我们展开说一下权限三位一组分别对应所有者、所属组、其他用户。r 读是 4w 写是 2x 执行是 17 421代表读写执行全有5 41代表读和执行。755 的意思就是文件所有者拥有全部权限组用户和其他人只能读和执行。这个经常用于目录因为目录需要有执行权限才能进入所以给目录设置 755 是很常见的操作。符号模式则更直观chmod ux file是给当前用户增加执行权限chmod g-w file是取消组用户的写权限chmod o file是所有其他用户权限清空。想给脚本加执行权限时我几乎不用数字模式而是用chmod x script.sh一行搞定不需要想 755 还是 744 的分别。如果你想给一个目录及其所有子目录统一切权限用-R参数递归但这一点必须格外小心。我曾经见过有人chmod -R 777一个 Web 目录结果所有子文件全成了全世界可写状态等于把后门敞开了。除非你明确需要这类开放权限否则轻易不要用 777我的底线是 755再灵活一点根据需求用 750。还有一个经常被新手忽略的机制叫 umask它就是“默认权限的黑名单”。你创建一个新文件出来的权限并不是 666而是 666 减去 umask 对应的值大多数发行版默认 umask 是 022所以新文件是 644新目录是 755。了解这个能解释很多为什么新建文件权限和想象不一致的困惑。如果你写脚本生成临时文件希望只有自己能读写那么可以在脚本里umask 077之后创建的文件权限就是 600。这个小细节在需要跨进程共享文件的场景里特别重要比如两个服务要读写同一个文件权限不对就会一直报 permission denied。改完权限记得验证一下我常用的验证命令是ls -l或者stat。stat能显示更详细的权限和修改时间包括 SELinux 上下文。我还想提醒一句chown 改属主和 chmod 改权限经常一起出现。文件从一个人传到另一个人手里直接用chown user:group file改属主不要想着靠一个 777 通杀权限设计越细后面出事故的概率越低。4. 磁盘、内存与进程系统排查的实用组合4.1 磁盘使用率与目录大小的分析思路磁盘满了是个经典事故现场也许你正在写日志也许某个程序报了 cannot create file第一件事就是把磁盘状态摸清楚。df -h是最直接的命令它显示每个挂载点所在文件系统的容量、已用、可用、使用率、挂载点。看惯了之后我一眼就找使用率接近 100% 的行。但 df 只能告诉你哪个分区满了没办法告诉你具体哪个目录吃掉了空间这时候就需要du出场。du -sh /var可以显示 /var 整个目录的总大小-s 是汇总-h 是人类可读。要从大目录里找出最占空间的具体子目录我用的是du -h --max-depth1 /var | sort -hr。这里 --max-depth1 限制只统计一层子目录sort -hr 按大小从大到小排序。这个组合的威力在于你可以快速定位大目录然后一层层往下钻最后揪出那个拖着几 G 日志文件的元凶。如果你不加 --max-depthdu 默认会把所有层级全列一遍输出几千行根本没法看。清日志是释放磁盘的常见操作。日志文件有个特点进程打开之后会一直持有文件描述符即使你直接rm删掉磁盘空间也不会立刻释放因为系统认为文件还被占用着。你会发现删了之后df -h使用率还是 100%很多人在这时候就慌了。正确思路是找到占用文件的进程重启它或者用truncate -s 0 /var/log/xxx.log把文件内容清空但保留文件句柄让进程继续写得下去。truncate这条命令很多人不知道但它真的是处理日志占盘问题的一把好工具。定时检查磁盘使用率的习惯也很重要。我一般会在服务器上跑一个简单的命令df -h | awk NR1 $50 80 {print}把这个命令写进定时任务配合邮件通知就不至于等到磁盘彻底满掉才发现。磁盘空间这件事预防的成本比事后抢救低得多du -sh和df -h用顺手后排查一次磁盘告警的时间能从几小时压缩到几分钟。4.2 内存与进程排查free、top、ps串联使用内存吃紧和磁盘满一样是线上服务的经典杀手。free -h查看系统内存占用注意输出的 available 字段它代表的才是主流的可用内存概念而不是 free 那一列。很多人看到 free 只有几百 M 就紧张其实那些内存可能都被 page cache 占了这属于正常情况Linux 会把空闲内存拿来做文件缓存需要时会自动释放。判断是否真的内存紧张主要看 available 是否还够以及 swap 的使用量是否在持续增长。swap 用得多往往意味着物理内存已经吃紧。top 是系统性能总览的入口。打开 top 之后我一般按M键让进程按内存排序按P键按 CPU 排序这样能迅速分辨谁是 CPU 大户谁在吃内存。还有一个容易忽视的细节是 load average它显示 1、5、15 分钟的平均负载。如果 5 分钟和 15 分钟的值都在持续爬升说明系统负载在加重如果 1 分钟很高15 分钟很低可能是一瞬间的峰值不用过度反应。这类时间维度的判断靠裸 top 是不够的我会在持续观察时用top -b -d 2 -n 10以批处理模式每两秒采样一次共采十次然后把输出存下来慢慢分析。排查具体进程ps aux是基础命令。它的输出里我常用的是%CPU、%MEM、COMMAND这三列配合--sort-%mem能按内存占用降序排列。想看某个具体进程跑没跑、PID 是多少用pgrep -fa process_name更直接。pgrep 会把匹配到的进程号和完整命令行一起打出来省得你去 ps 的输出里反复找。如果你只想确认某进程是否还在响应pidof nginx能给出它的 PID配合后面的kill -0 PID可以做存活检查这在写监控脚本时特别常用。内存排查和进程排查从来不是独立的。一个 Java 应用内存飙升你既要看 free 的总量变化也要用 ps 或 top 锁定是哪个进程在涨还要进一步看它的子线程、GC 日志、或者 /proc/PID/status 里的 VmRSS 来确认实际占用。cat /proc/PID/status | grep VmRSS能告诉你这个进程的物理内存占用是多少这是核实真实内存使用的一个快速手段。4.3 kill的信号选择与后台任务处理kill 这个命令名有点吓人很多人以为作用就是强杀进程。实际上 kill 的本质是向进程发送信号进程收到信号后怎么处理取决于自身逻辑。最常用的两个信号是 SIGTERM默认数字 15和 SIGKILL数字 9。SIGTERM 是礼貌通知意思是“你可以准备一下再退出”SIGKILL 是强制终止不给进程任何清理机会。我推荐顺序是先 pid 找到进程再kill -15 PID等几秒看进程是否退出没动静再kill -9 PID。直接上 9 会丢失进程正在处理的数据尤其对数据库类进程强杀极易造成数据不一致。还有一组容易被忽略的参数kill -1 PID是 SIGHUP很多服务把它定义为重新加载配置或平滑重启相当于你改了配置文件之后不想中断连接就发这个信号让进程自己热加载。kill -0 PID不发送任何真实信号只是检查进程是否存在返回值可以用于脚本判断。这几个信号在管理长期运行的服务时比粗暴的 stop/start 脚本更精准。你还需要了解怎么把命令放到后台跑nohup command 。nohup 的意思是“不挂断”即使你关掉终端进程也不会收到挂断信号。比如你要跑一个耗时的数据任务又不希望因为网络断开或终端关闭而中断就用这个。注意是立即把命令放到后台的 Shell 语法两者组合是常见搭配。跑起来之后用jobs -l查看当前 Shell 的后台任务或者用ps aux | grep command查找真实运行状态。输出日志别不管nohup command /var/log/task.log 21 把标准输出和错误输出都重定向到文件回头排查才看得到发生了什么。21的意思是文件描述符 2标准错误重定向到文件描述符 1标准输出目前指向的位置这行是写脚本避不开的经典。后台任务的清理也是一个实操要点。你有多个后台任务在跑想知道哪个还在ps -eo pid,etime,cmd | grep task_name能显示每个进程已运行的时间帮你判断是否有卡死的任务需要清理。对于卡住的任务除了 kill 之外你还得检查它有没有留下临时文件或子进程经常杀了一个父进程子进程还活着继续占用资源。稳妥做法是pkill -f task_name它按命令行匹配并杀掉所有相关进程比逐个 kill PID 高效但注意-f会匹配完整命令行小心别把带有相同参数的无关进程也带走。5. 网络排查与远程操作命令组合的思路5.1 连通性检查ping的意义和边界排查网络问题很多人第一个反应就是 ping 对方 IP。这个习惯不能说错但只知道 ping 是远远不够的。ping 基于 ICMP 协议核心作用是确认目标主机是否可达、网络链路是否通畅以及往返时延大致是多少。它能告诉你“这条路通不通”但它不能告诉你“这条路具体哪一段有问题”也不能帮你确认端口服务是否在监听。实际排查我会分三步走。第一先 ping 网关确认本机到局域网的链路是否正常。第二ping 对端 IP确认跨节点的连通性。第三如果 IP 通但域名不通问题大概率出在 DNS 解析这时候用nslookup或dig查解析记录。有一回我排查一台机器访问不了某个服务ping IP 一切正常但服务就是连不上后来发现是域名解析到了旧地址。这种场景就属于 ping 无法覆盖的部分。ping 本身也有一些参数值得用。ping -c 4 host是只发四个包然后自动停止不加 -c 的话会一直 ping 下去在脚本里非常危险。ping -i 0.2可以缩短发包间隔快速采样。ping -I eth0 host可以指定从哪个网卡出去在一台机器有多网卡、要测试特定线路时特别有用。另外ping 输出里的 time 就是往返时延丢包率 packet loss 是关键指标。如果出现大量丢包基本可以判断链路上有拥塞或故障。但记住一个重要边界很多云环境默认禁止 ICMPping 不通不代表服务不可用你需要继续测试具体端口。这就是我接下来要讲的东西联通性检查不能止步于 ping。5.2 端口和连接排查ss、netstat的使用端口和服务是网络排查的第二层。如果 ping 通了但服务还是连不上下一步就是确认目标端口有没有进程在监听。传统工具是 netstat现在很多发行版默认用 ss它更快、输出也更清晰。ss -tlnp是我最高频的组合t 是 TCP、l 是监听状态、n 用数字显示端口不反查域名、p 显示占用端口的进程信息。你可以直接看到当前机器上哪些 TCP 端口在监听由哪些进程占用。比如你想确认 Nginx 是否在监听 80 端口ss -tlnp | grep :80一秒钟出结果。如果你想看当前这台机器建立了哪些连接ss -tn state established可以只列出已建立的连接。排查连接数是否异常时我会用ss -s它直接输出整个系统的连接统计摘要包括 TCP 连接总数、各状态数量。如果你发现 TIME_WAIT 数量暴涨那就是有大量短连接在频繁建立和关闭这是客户端连接池配置不合理时的常见现象。TIME_WAIT 本身是 TCP 协议设计的正常状态但数量过大确实会影响性能需要从应用侧调整连接复用而不是简单粗暴去改系统内核参数。netstat 也没过时有些老系统只有 netstat 没有 ss基础用法netstat -tlnp与 ss 等价。端口被占用时我想快速定位是谁占的lsof -i:8080更好用lsof 是“列出打开的文件”工具因为 Linux 一切皆文件socket 也是文件。它直接输出占用 8080 端口的进程 PID 和命令名对于“明明服务没起但端口却冲突”这种问题一查一个准。这类问题我排得多了总结就是ping 管三层可达性ss/netstat 管四层端口状态lsof 管进程和端口映射关系它们组合起来才能完整还原网络故障现场。5.3 curl 在接口调试中的应用curl 可能是 Linux 上最全能的网络调试工具。它支持 HTTP、HTTPS、FTP 等多种协议日常工作中我主要拿它做接口测试和连通性验证。最简单的curl http://example.com会把响应体整个打到屏幕上但如果你想看更详细的信息-i可以显示响应头-v则把整个请求细节全部打出来包括 DNS 解析、TCP 建连、TLS 握手、发送的请求头、响应头。我第一次用-v调试的时候那叫一个豁然开朗因为前后端联调时很多诡异问题就藏在握手或请求头里。接口调试时curl -X POST http://host/api是手动指定请求方法。但很多人不知道日常测试带 JSON 数据的接口规范写法是curl -X POST -H Content-Type: application/json -d {key:value} http://host/api。-H设置请求头-d是请求体数据如果数据字段多建议写进一个文件再用-d data.json读取。这样既能保持命令可读性又能避免在终端里手敲一大段 JSON 还担心转义错误。还有一个非常实用的参数是-w。它能自定义输出统计信息我习惯用它来看接口响应的耗时分布curl -o /dev/null -s -w 连接耗时: %{time_connect}s 总耗时: %{time_total}s http://host/api。这里的 -o /dev/null 是把响应体丢弃因为我只关心耗时数据-s 是静默模式不显示进度条。这个命令在对比不同服务节点的响应速度、判断某个接口瓶颈在连接还是传输时特别好用。我以前排查一个接口偶尔变慢的问题就是用这组参数对比后发现 DNS 解析阶段偶尔超过一秒后续加了缓存策略解决了。curl 还有一个我没少用的功能是下载文件。curl -O http://host/file.tar.gz直接用原名保存-L支持跟随重定向。下载大文件时加-C -可以断点续传这比 wget 在某些场景下更灵活。总之curl 能覆盖你调试 HTTP 接口 90% 以上的需求值得花时间把参数组合玩熟。# 常见 curl 调试组合 curl -sv http://host/api/v1/health 21 | head -n 30 curl -X POST -H Content-Type: application/json \ -d {username:admin,password:123456} \ http://host/api/login一点实际体会我刚开始学这些命令时总想着把所有参数背下来结果背了就忘后来发现根本不需要背只需要理解每个命令的核心用途和最少必要参数然后在真实场景里反复用肌肉记忆自然就形成了。你不需要记住ss的全部选项只要记住“看端口服务用ss -tlnp”这一条就够了不需要背下 awk 的完整语法只要记住“取字段、写判断、用内置变量”这三个点就能应付绝大多数日常处理。Linux 命令的世界很大但真正把你工作撑起来的就是这几十个命令加十几个组合把这些用扎实比囫囵吞枣刷几百个命令有用得多。如果这篇文章能帮你在某个排查场景里少走一小段弯路那它就没白写。