Linux基础命令实战:从入门到排障的常用命令详解

发布时间:2026/10/14 23:01:43
Linux基础命令实战:从入门到排障的常用命令详解
刚接触Linux的时候最劝退的不是配置文件也不是报错信息而是那排黑底白字的终端窗口光标一闪一闪敲个ls才能看到文件敲错一个字母还得被系统回一句“command not found”。说实话Linux基础命令这个主题网上随便一搜就是命令大全但真到了自己上手很多人的卡点不是“记不住命令”而是不知道一条命令解决什么问题、什么时候用哪个命令、参数组合起来能干什么。这篇文章我只讲实际生产环境里最常用、最顶得住的那批命令把每条命令为什么会这么设计、踩坑点在哪里说清楚。适合刚入门的开发者、运维新手以及从Windows转过来还没完全适应命令行操作的朋友。1. 先搞清楚核心需求基础命令解决什么问题1.1 脱离图形界面也能干活Linux服务器多数时候没有桌面环境一个远程终端连接就是全部入口。你先要弄清一个事实在终端里敲的每一条命令本质上都是在调用某一个程序。ls是列出目录的程序cat是读取文件的程序命令的选项和参数则是你传给它的输入。图形界面里点一下图标背后也是执行同样的程序只不过把结果画成了图标和窗口。命令行看似原始但它做两件事很厉害一是组合能力强一条命令的输出能直接喂给另一条命令二是可重复性强敲过的命令能保存、能写进脚本自动执行。所以即使桌面Linux做得越来越漂亮服务器上依然以命令行为主。1.2 命令的通用结构选项和参数到底该怎么理解命令的基本结构是命令 选项 参数。ls -l /etc这条里ls是命令-l是选项/etc是参数。选项告诉命令“我要什么格式”参数告诉命令“我要处理谁”。选项又分短选项和长选项短选项是-l、-a、-h这种单字母可以合并成-lah长选项是--list、--all这种一般用来写脚本因为可读性好。拿不准的时候先敲命令 --help或者用man 命令看手册。Linux命令参数大同小异但不要死记每个参数记住结构以后看到陌生命令也能猜出个大概。1.3 管道与重定向让基础命令组合干活单条命令功能有限所以Linux把命令组合这件事做得极其顺滑。|叫管道作用是把前一条命令的输出当成后一条命令的输入。举个例子ls -l | grep ^- | wc -l能统计当前目录下普通文件的数量先列出详细信息grep ^-只留权限字段以-开头的行wc -l数行数。这就是命令行最迷人的地方每个零件都能换。重定向符号也常用把输出覆盖写入文件追加写入文件2单独捕获错误输出。比如nohup ./app.sh app.log 21 是跑后台任务时常见的写法21就是把标准错误也塞进标准输出一起落进日志。ls -l | grep ^- | wc -l nohup ./app.sh app.log 21 2. 文件与目录操作每天都要用的基本功2.1 先认路pwd、cd、ls打开终端第一件事是知道自己在哪里。pwd会打印当前工作目录的绝对路径cd切换目录cd ..回上一级cd ~回当前用户home目录cd -回上一次所在的目录。这些看起来基础但实际操作时超级有用尤其用cd -在两个目录之间来回跑的时候能省掉很多重复打字。ls是最高频的命令之一。裸敲ls只显示文件名ls -l显示权限、属主、大小、修改时间ls -a显示隐藏文件ls -h把文件大小显示成 K、M、G 这种易读格式ls -t按时间排序。很多人习惯给它设个别名ll其实就是ls -l的别名。排障时我最常用的组合是ls -lht一眼就能看到最近改过的文件。这个组合每次都能帮我快速判断日志或配置到底有没有在预期时间内更新。参数作用常用场景-l长格式显示看权限、属主、大小-a显示隐藏文件找以.开头的配置-h人类可读大小看文件大小不用数字节-t按修改时间排序找最近改动的文件2.2 建文件、建目录与删除touch、mkdir、rmtouch a.txt如果文件不存在就创建一个空文件如果文件已经存在更新的只是时间戳不会清空内容。这个命令在快速生成配置文件、触发某些服务重读时很顺手。mkdir -p a/b/c能一次创建多层目录如果不加-p父目录不存在时会直接报错。我见过不少人第一次用mkdir时因为少了个-p被卡住其实报错信息已经把原因说得很明白没有那个文件或目录。rm是危险分子rm -r递归删除目录rm -f强制删除不询问。组合成rm -rf会把目录连根拔起而且不给你反悔机会。我的建议是关键目录上先ls看一下再删能加-i就加-i让系统删每个文件前问你一遍不要在不确定路径的情况下用通配符。技术上rm没有回收站删掉的普通文件很难恢复这一点后面专门讲。cp -r复制目录-a保留权限和时间属性mv是移动文件也能当重命名用。这些命令参数不多但组合起来能解决大多数文件管理问题。给新手一个建议别把cp和mv当成“能复制粘贴就行”真正要知道的是-r、-a这些选项在不同场景下的差异否则复制出来的配置可能因为权限不对导致服务起不来。touch app.conf mkdir -p data/logs/2025 cp -r /opt/old /opt/new mv app.conf app_backup.conf2.3 查看文件内容与日志追踪cat、head、tail、lesscat适合查看小文件比如cat /etc/hostname。但它会把整个文件哗啦一下全输出出来大日志文件千万别用cat直接看容易刷屏。想看前几行用head -n 20想看末尾用tail -n 20实时跟踪日志用tail -f加-f后终端会一直跟着文件尾部刷新按 CtrlC 退出。less适合翻页查看按空格翻页按/搜索按q退出打开大文件也不卡因为它不是一次性全读进内存。实际排查时我会用tail -f app.log | grep ERROR把新进来的错误直接过滤出来。注意这里管道把tail的实时输出喂给了grep比直接打开几百兆日志文件强太多了。这个组合也是线上问题定位的标准起手式能快速判断服务是不是在持续报错。head -n 20 app.log tail -n 50 app.log tail -f app.log | grep ERROR less /etc/app/app.conf2.4 查找文件与定位命令find、which、typefind是万能查找器但别上来就find / -name *.log根目录全盘扫描能跑到怀疑人生。先用find /var/log -name *.log -mtime -7表示在 /var/log 下找文件名匹配 *.log、修改时间在7天内的文件。这个-mtime -7在清理老日志、找最近改动的配置文件时很实用。-maxdepth可以限制搜索深度比如find /etc -maxdepth 2 -type f -name *.conf。which 命令名用来定位命令的可执行文件路径比如which python3。type还能看出这个命令是程序、别名还是Shell内建命令。有时候你敲ls和系统默认的ls行为不一样多半是别名在起作用用type ls一查就知道。find /var/log -name *.log -mtime -7 find /etc -maxdepth 2 -type f -name *.conf which python3 type ls3. 权限与用户管理理解Linux安全的起点3.1 权限模型与chmod数字ls -l输出的第一列有10个字符比如-rwxr-xr--。第一个字符表示文件类型-是普通文件d是目录l是软链接。后面9个字符分成三组属主、属组、其他用户每组三位分别是读r、写w、执行x。为什么命令里经常看到chmod 754因为r4、w2、x1754就是属主7拥有 rwx属组5拥有 r-x其他用户4只有 r--。数字只是一个加法编码理解底层后不用背。数字权限组合含义7rwx读写执行6rw-读写5r-x读执行4r--只读0---无权限目录权限比文件更容易踩坑目录的r决定你能不能列出里面的文件名x决定你能不能进入这个目录。只有r没有x你可以ls看到名字但cd进去会被拒绝。所以别以为给了读就给全了权限。chmod -R能递归改目录下所有内容但生产环境慎用一个不小心就会把所有文件权限改乱。修改属主属组用chown user:group file比如把文件从 root 改成服务运行用户的。chmod 754 script.sh chmod x script.sh chown appuser:appgroup /var/lib/app/data3.2 用户切换与sudo的边界一般人登录服务器用的都是普通用户遇到系统级操作才用sudo提权。推荐这种模式因为 root 最高权限没有保护手滑一条命令能把系统搞挂。sudo默认需要当前用户有 sudo 权限执行时输的是自己的密码不是 root 的密码。su - 用户名则直接切换到另一个用户需要知道那个用户的密码su -切换成 root。sudo -i和sudo -s都能得到一个 root shell但环境有区别。实际工作中我几乎不用su而是习惯在每条需要特权的命令前加sudo。这样明确知道自己做了什么也方便在历史记录里审计。如果一条命令报Permission denied先想两个问题当前用户是谁目标文件属于谁用whoami和id查看当前身份信息再决定是否需要切换用户。很多新手一上来就切 root结果所有文件都变成 root 所属后面服务跑起来反而权限报错。whoami id sudo systemctl status app su - appuser3.3 进程查看与终止ps、top、kill定位进程是排障基本功。ps -ef和ps aux都能列出进程显示 PID、父进程 PID、CPU/内存占用、启动命令。两个写法出自不同风格实际效果差别没想象中那么大随便记一个就行。实时看资源占用用top按q退出top里能按 CPU 或内存排序还能直接看到哪个进程吃满资源。要停止某个进程用kill PID发终止信号系统默认 SIGTERM让进程自己处理退出逻辑这是礼貌的停法。如果进程卡死不回应kill -9 PID发 SIGKILL内核直接把它干掉但进程来不及保存状态非必要不用。找进程我常用ps -ef | grep app但要注意grep自己也会出现在结果里所以很多人会再加一个grep -v grep把那一行排除掉。后来我发现直接pgrep -f app更清爽能直接输出匹配进程的 PID。ps -ef | grep app | grep -v grep pgrep -f app kill 12345 kill -9 123454. 文本处理三剑客grep、sed、awk4.1 grep从文件和大段输出里捞关键行grep是我使用频次最高的文本命令没有之一。基本用法是grep pattern file把文件里匹配pattern的行打印出来。实际运维里90%的查询不需要正则级知识但几个参数值得记-i忽略大小写-v反选显示不匹配的行-n显示行号-r递归搜索目录-E支持扩展正则。比如看配置时不想被注释和空行干扰可以grep -vE ^\s*(#|$) /etc/app/app.conf。这条命令里^\s*匹配行首空格#是注释号$匹配空行-v把匹配到的全排除。这种组合在排查配置时能让你一眼看到有效内容。日志排障也离不开它grep -i error /var/log/app.log | tail -n 50只看最后50条错误。grep -n timeout app.conf grep -vE ^\s*(#|$) /etc/app/app.conf grep -i error /var/log/app.log | tail -n 504.2 sed批量替换和按范围提取sed是流编辑器适合做替换和按行处理。最常用的是sed s/old/new/g file把每行中所有old替换成new。加了-i才会直接改原文件不加只是把结果打印到终端。这里必须强调第一次用-i时先不加-i跑一遍看输出确认无误再加这样能避免把线上配置改错还不自知。更稳的做法是sed -i.bak s/old/new/g file改之前先留一份file.bak备份。除了替换sed -n 10,20p file能只打印第10到第20行适合取日志的某一段。sed -n /2025-01-01 10:00/,/2025-01-01 10:30/p app.log可以提取指定时间窗口内的日志配合grep做二次过滤定位问题会很高效。sed -i.bak s/127.0.0.1/0.0.0.0/g app.conf sed -n 10,20p app.log sed -n /2025-01-01 10:00/,/2025-01-01 10:30/p app.log4.3 awk按列拆分做统计awk最核心的价值是把文本按列切分再处理。默认按空白字符切分$1是第一列$2是第二列$0是整行。awk {print $1, $2}就能把每行的前两列抽出来。遇到:分隔的文件比如 /etc/passwd用-F:指定分隔符awk -F: {print $1} /etc/passwd就能列出所有用户名。有了 awk很多小统计不用写脚本。比如想算进程占用内存总和ps aux | awk NR1 {sum$6} END {print sum}NR1跳过表头$6是 RSS 内存列END块在处理完所有行后执行。初次看到这种写法可能头晕但记住BEGIN、主循环、END三个块awk 的骨架就出来了。要是想改文件内容sed 和 awk 经常组合用先用 awk 取列再用 sed 替换两个都纯熟后处理文本就不是障碍了。awk {print $1, $2} access.log awk -F: {print $1} /etc/passwd ps aux | awk NR1 {sum$6} END {print sum}5. 网络与磁盘命令排查问题必备5.1 网络连通性ping与curl网络排障从ping开始。ping -c 4 目标地址表示只发4个ICMP包然后看通不通、延迟多少。不加-c会一直发停止才退出。记住 ping 不通不一定是服务问题很多系统会禁 ICMP 协议主机能ping通、应用不一定能访问反过来ping通只代表网络层通不保证端口和服务正常。要测试 HTTP 服务curl更实际。curl -I http://localhost:8080只请求头查看状态码curl -v看详细交互过程包括DNS解析、TCP连接、TLS握手curl -L跟随重定向curl -o file URL下载文件。排接口问题时curl -v是我第一个用的工具它能直接告诉你连接到了哪个IP、请求发了什么、响应回了什么很多问题一眼就能看出来。ping -c 4 目标地址 curl -I http://localhost:8080 curl -v http://localhost:8080/health curl -L -o page.html http://example.com5.2 端口监听与连接查看ss与netstat服务起没起、端口有没有被占用用ss -tlnp查看所有监听状态的TCP端口-t只显示TCP-l只看监听-n用数字显示端口-p显示进程名。如果你运行后看不到进程多半是权限不够加sudo再看。netstat -tlnp也是经典组合但部分最新发行版默认不装 netstat而 ss 来自 iproute2 包基本是系统的标配所以我建议优先用 ss。排查端口被占用是最典型的场景启动服务时提示地址已被使用ss -tlnp | grep 8080就能看到占用进程 PID再决定是换个端口还是处理掉旧进程。连接状态里出现大量TIME_WAIT或ESTABLISHED也很常见ss -s能输出连接统计适合快速判断系统网络压力。ss -tlnp sudo ss -tlnp | grep 8080 ss -s5.3 磁盘与内存df、du、free磁盘满了是线上事故常见原因之一。df -h查看各文件系统的使用率-h显示成 G、M 这样的可读大小。别只看使用率百分比还要关注 Inodesdf -i如果 Inodes 使用率到了100%即使磁盘还有空间也创建不了新文件这种问题特别隐蔽。du -sh /var/log查看目录总大小du -h --max-depth1 /var/log按一层深度列出每个子目录的大小。磁盘告警的时候我的排查顺序是df -h找到满的分区再du --max-depth1逐层下压定位到最大的目录和文件。内存命令free -h看起来最骗人。在 Linux 上内存不是“used 高就内存不足”因为内核会把空闲内存用作缓存。正确看available这一列它才是真正可用于新进程的内存估算。我见过有人一看到 used 达90%就慌了结果 available 还有一大半纯粹是误解了缓存机制。df -h df -i du -sh /var/log du -h --max-depth1 /var/log | sort -rh free -h6. 常见问题与排查技巧实录6.1 Permission denied先看权限再决定怎么改这个提示应该最高频。处理思路一定要按顺序来先ls -l看目标文件的属主、属组和权限位再id看当前用户属于哪个组然后判断是“没读权限”还是“没执行权限”。如果是脚本无法执行检查有没有x位没有就chmod x。如果是自己创建的目录进不去检查父目录的x位。如果是改别人的文件先用sudo提权而不是粗暴地把整个目录chmod 777。777 虽然能解燃眉之急但等于把所有用户读写执行权限全摊开安全上非常得不偿失。还有一个容易忽略的情况sudo能执行但普通用户执行报Permission denied这不一定是文件权限问题也可能是目标目录本身对当前用户不可写。比如你想往 /etc 写配置普通用户本来就没权限这才是正常逻辑。6.2 command not found命令找不到还是软件没装command not found有三种常见原因拼写错了、命令真的不存在、软件装了但不在PATH中。先检查拼写然后which 命令名或type 命令名看看有没有这个程序。如果软件已经安装但找不到看echo $PATH里有没有包含安装目录再把对应目录加进PATH。最小化安装的发行版里很多网络命令默认不带比如某些旧习惯里用ifconfig新系统却只有ip addr这时可以先试试ip再考虑安装对应工具包。脚本里报 not found 还有一层你写了script.sh但没加./前缀Shell 不会在当前目录找普通文件名必须写./script.sh或使用绝对路径。这个问题在写计划任务脚本时特别常见明明手动能执行一进脚本就报错多半就是相对路径和 PATH 环境不一致造成的。which 命令名 type 命令名 echo $PATH ./script.sh6.3 误删文件别慌但大概率只能预防Linux 命令行里rm没有回收站这点和图形界面完全不同。文件被删除后如果还有进程在打开它理论上能通过/proc/文件描述符恢复部分内容但普通场景下很难操作。所以我的原则是删除前先pwd确认路径再ls确认删的是预期目标重要目录用rm -i逐个确认大批量删除时先用find把文件列表输出出来检查再执行删除。更稳的做法是不要用rm直接处理重要文件而是mv到一个临时目录观察几天没问题再清空。这里举一个高危场景脚本里写rm -rf $DIR/*如果$DIR变量因为某种原因变成空字符串命令就变成了rm -rf /*后果不用多说。防止这个怪招可以给变量加默认值写成rm -rf ${DIR:-}/*或者脚本开头加set -u让未定义变量直接报错。这些细节比背一百条命令更能救命。rm -i app.conf mv /data/old /data/trash rm -rf ${DIR:-}/* set -u6.4 日志刷屏怎么从海量日志里快速捞到有用的行日志文件动辄几GB的时候千万别cat。先说实时跟踪tail -f app.log | grep -E ERROR|Exception让终端只显示新产生的错误行。如果不想实时只看最后一段tail -n 200 app.log | grep -i error。如果知道大概时间范围用 sed 提取区间sed -n /2025-01-01 10:00/,/2025-01-01 10:30/p app.log把这段时间内所有日志打印出来再用 grep 精筛。还有一个技巧先wc -l看日志总行数再决定用什么方式读。几十行用cat没问题几百行用less几万行老老实实tail或sed配合grep。排查完记得把日志清理策略也检查一遍别等到占满磁盘才处理。最后说一个我自己的习惯Linux基础命令单看哪一条都不难难的是组合。我很少去背“完整命令大全”而是先理解每条命令的输入输出命令吃进去什么吐出来什么怎么用管道接上下一条。碰到新场景就把几个命令拼起来试比如用ls找到文件、用grep过滤内容、用awk提取字段、再通过sort和uniq统计。练到这个思路Linux基础命令就不再是死记硬背的清单而是一套随时能搭起来的工具链。希望这篇整理能帮你少踩几个我踩过的坑。