ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Linux常用命令详解与避坑指南:从文件管理到日志排查实战

Linux常用命令详解与避坑指南:从文件管理到日志排查实战 简介一份面向Linux终端高频操作场景的常用命令速查文档适合需要每日与服务器打交道的运维人员、技术支持工程师也适合想从零掌握Shell基础的学习者。文档按功能模块集中整理了文件与目录操作、系统状态查看、进程管理、文本内容查看、网络配置、文件权限、压缩解压等常用命令每条命令均附有具体示例与简短说明例如cd切换目录、top查看资源占用、kill强制结束进程、chmod调整权限、tar打包解包等便于在实际排错时快速套用。资源共1个docx文件压缩包大小仅18KB体积小巧而信息密度高。除命令外还收录了Ctrll、Ctrlr等快捷键以及重定向、管道、通配符等符号的基本用法能帮助读者理解命令输出组合与简单脚本编写。目前已有320人学习/下载适合作为Linux日常操作和面试复习的随手查阅手册。1. Linux 系统常用命令与操作详解先搞清你每天在敲什么新接手一台服务器第一件事不是部署环境而是把 Linux 账号权限、服务状态、日志位置、磁盘水位快速摸一遍。多数人觉得 Linux 常用命令与操作是入门课真正上了生产环境才发现ls、grep、awk、systemctl 这几个基础命令的熟练度决定了你能在五分钟内定位故障还是查一上午。这篇笔记从文件操作讲到文本处理、权限与进程管理每一段都带可以照抄的命令和参数说明适合刚接触 Linux 的开发、运维以及准备 Linux 面试题测试的从业者也适合想把手头命令行操作从“能跑”提升到“可维护”的熟手。2. 文件与目录操作ls/cd/cp/mv/rm 的底层逻辑与高频参数2.1 为什么先理解“一切皆文件”再背命令Linux 和 Windows 在操作习惯上最明显的差别就是 Linux 把普通文件、目录、管道、设备、socket 全部抽象成文件。你 ls 一个目录、读一个串口、统计一个进程的网络连接背后都是文件描述符上的读写操作。这个观念一旦建立再看常用命令时就不会觉得它们是孤立的指令而是对同一类对象的统一操作。网上有不少 Linux vs Windows 常用命令对照的整理思路不错但直接对照容易踩坑因为两个系统的路径语义、权限模型和文件锁机制差异很大。理解了这一点文件与目录操作在设计上就有了一个“先确认对象、再执行动作”的流程先用 ls 或 stat 看清对象类型和权限再用 cp/mv/rm 操作操作后用 ls 或 diff 验证结果。很多生产事故不是命令写错而是没有做第一步确认。下面三段是我实际工作中固定会用到的最小命令集。2.2 高频文件操作的参数选择ls、cp、rm 的必调参数ls -lhtr /var/log/ | head -20 cp -av /opt/app/ /tmp/app_backup/ mv -n /data/report_2024.csv /data/archive/ rm -rf -- /tmp/app_backup/old_cache第一行里-l 列出权限、属主、大小和修改时间-h 把大小显示成人可读的 K/M/G-t 按时间排序-r 反序这样最新的日志永远在最后一行。配合 head -20不需要用分页器逐页翻。很多人只记 ls -l却忽略 -t 和 -r 在日志目录里的价值。第二行 cp -av 适合整目录备份。-a 等价于 -dR --preserveall把所有属性、链接和时间戳一并保留-v 会打印每个被复制的文件。备份最怕静默成功-v 能看到复制过程复制完再 diff -r 原目录和目标目录做校验。第三行 mv -n 是 no-clobber目标位置已有同名文件时不覆盖这条在生产环境是保命参数。第四行的 rm -rf -- 有一个细节-- 表示后面的参数不再解析成选项。如果文件名以减号开头例如某次导出生成的 -result.csv不加 -- 会被 rm 当成选项而报错。rm 是各种 Linux 常用命令大全式资料里最常出现、也最容易翻车的命令参数表如下。场景推荐参数说明查看日志目录ls -lhtr按时间倒序最新在最下方整目录备份cp -av保留属主、时间戳、软链接移动文件防覆盖mv -n有同名文件时不覆盖强制删除目录rm -rf ---- 防止文件名以 - 开头被误解析2.3 通配符与花括号展开脚本化批量操作的起点find /data/logs -name *.log -mtime 7 -delete ls /data/backup/2024*/weekly/*.tar.gz cp /data/{nginx,app,db}/*.conf /tmp/config_backup/真正让命令操作摆脱“一条条敲”的是通配符和花括号展开。第一行用 find 按条件删除 7 天前的 .log 文件-mtime 7 表示超过 7 天-name *.log 做扩展名过滤-delete 直接删除。这里有个原则先运行不加 -delete 的版本输出确认后再加上比直接删安全得多。第二行用 * 通配符跨目录匹配适合列出按月归档的备份。第三行花括号展开会把 {nginx,app,db} 展开成三个路径后缀等价于写三条 cp。注意它只做字面展开不会递归匹配文件名通配符 * 在没匹配到任何文件时会把字面字符串保留传给命令脚本里容易出现“文件不存在”报错建议先执行 shopt -s nullglob 让未匹配的通配符展开为空。提示批量删除或移动前先把命令里的 rm/mv 换成 echo 跑一遍确认展开结果符合预期再执行这是能省下大量恢复时间的最小成本操作。2.4 软链接与硬链接ln 的边界和文件系统限制ln -s /data/release/current /opt/app/current ln /data/release/app.jar /data/backup/app.jar.link第一行创建软链接相当于 Windows 里的快捷方式跨文件系统可用删除软链接不影响原始文件。第二行创建硬链接本质是同一个 inode 的另一个目录项修改任意一边另一边也会变。硬链接不能跨文件系统创建也不能对目录创建这是面试里常被追问的边界。排查时用 ls -l 看软链接指向用 stat -c %i 查看文件 inode 编号两个文件 inode 相同才能确认是硬链接。2.5 操作前先确认对象stat 与 file 的用法stat -c %F %s %y /opt/app/application.yml file /opt/app/application.yml ls -li /opt/app/stat 输出文件类型、字节数和最后修改时间-c 可以自定义格式适合脚本里取单个字段。file 不看扩展名直接读文件头判断真实类型比如判断一个 .conf 文件到底是不是 UTF-8 文本或者一个可疑文件是否是 ELF 可执行程序。ls -li 显示 inode 号和 find -samefile 配合能确认两个路径是否指向同一文件。这组命令在脚本里常被忽略但恰恰是排查“看着是配置文件系统却不认”的第一手证据。3. 文本处理三剑客与日志排查grep/sed/awk 的组合打法3.1 grep 过滤的常用参数搜索日志时先加哪些参数日志搜索常用命令里grep 是出场率最高的一个。选参数前先想清楚你是在几个 GB 的历史日志里找线索还是在实时刷新的日志里跟踪状态。两种场景的参数组合不一样。grep -n ERROR /var/log/app.log | tail -50 grep -E ERROR|FATAL|Exception /var/log/app.log --line-buffered grep -rl 支付回调失败 /data/logs/ 2/dev/null第一行 -n 输出行号配合 tail -50 看最后 50 条匹配结果是日志排查最常用的形态。第二行用 -E 启用扩展正则多个关键词用 | 并列--line-buffered 让 grep 逐行输出而不是攒一批再输出和 tail -f 配合能实时看到新增的匹配行。-r 是递归目录-l 只输出包含匹配内容的文件路径2/dev/null 丢弃无权限目录的报错避免噪音干扰判断。参数作用使用场景-n显示行号定位到具体行后配合 sed 分片查看-E扩展正则多关键词或复杂匹配-v反向过滤排除 grep 自身进程等干扰行-l只列文件名在大目录里找包含关键词的文件--line-buffered逐行刷新输出配合 tail -f 实时跟踪实际排查时先 grep -c 统计匹配行数再判断值不值得展开如果几秒钟没返回说明文件很大或匹配太宽先 CtrlC 停下来改小范围再试。这个习惯能省下大量干等时间。3.2 sed 做流式替换改配置文件的两种常用姿势sed 最常见的价值不是删除数据而是在不改动整个文件的前提下做流式替换。生产环境改配置我最怕用编辑器顺手保存时引入多余字符sed 的原地替换配合备份文件是最小化变更的方式。sed -i.bak s/old_endpoint/new_endpoint/g /opt/app/application.yml sed -n 20,50p /var/log/nginx/access.log第一行 -i.bak 的意思是原地替换且生成 .bak 备份文件。写成 -i.bak 而不是 -i是因为 mac 和 Linux 对 -i 后参数的处理不同Linux 的 sed -i 后面可以直接跟扩展名mac 的 sed -i 要求必须有一个扩展名参数统一写成 -i.bak 两种环境都能跑。s/old/new/g 末尾的 g 表示全局替换不加 g 只替换每行第一个匹配。注意替换分隔符不一定是 /路径里带斜杠的内容可以把分隔符改成 #sed -i.bak s#/old/path#/new/path#g不用转义斜杠。第二行 -n 20,50p 是查看文件指定范围-n 关闭默认输出p 只打印指定行。当 grep 出来的匹配集中在某一段时用 sed 把这个区间拉出来分析比反复 grep 高效得多。3.3 awk 按列处理日志字段提取与统计awk 的核心是按列拆解文本并且自带编程能力能在处理每个字段时做条件判断和统计。前面 grep 负责找行awk 负责把行里的字段变成结构化数据这组搭配是排查性能问题时用得最勤的组合。awk {print $1, $9, $7} /var/log/nginx/access.log | sort | uniq -c | sort -rn | head awk -F: {if($31000 $365534) print $1} /etc/passwd第一行提取 access.log 的 $1 客户端 IP、$9 状态码、$7 请求路径。awk 默认用空白符做分隔print 的字段用逗号隔开时输出以空格分隔。管道里 sort 排序uniq -c 统计每行次数sort -rn 按次数倒序取前 10 行就能快速看出访问量最高的路径或状态码分布。第二行用 -F: 指定冒号分隔符因为 /etc/passwd 是冒号分隔$3 是用户 UID把 UID 1000 到 65534 的用户过滤出来排除系统账号。awk 内置变量里要掌握四个$0 整行、$NF 最后一个字段、NR 当前行号、FS 字段分隔符基本覆盖九成场景。处理日志时如果发现字段对不上先输出一行原始日志看实际分隔符可能是多个空格或制表符混用这些都是排查时的黑匣子。3.4 压缩日志的搜索zgrep 与 zcat 的用法日志按天切割后通常会被 logrotate 压缩成 .gz 文件。grep 直接读 .gz 只会输出“binary file matches”或乱码这时候不要先解压再查而是直接用 zgrep。zgrep ERROR /var/log/nginx/access.log.20250115.gz | tail -20 zcat /var/log/nginx/access.log.20250115.gz | sed -n 1,20pzgrep 是 gzip 的 grep 封装直接读取压缩内容不需要解压整个文件。zcat 输出解压后的全部内容到标准输出再交给 sed 分片查看。两者的共同点是避免在磁盘上生成解压副本对大日志文件特别友好。如果服务器上没有 zgrep检查 gzip 包是否安装嵌入式或车载 Linux 环境里工具链可能被裁剪过这时用 gzip -dc 文件.gz | grep 效果一样。4. 权限与进程管理权限位、systemctl 与 kill 的正确姿势4.1 chmod/chown 的数值逻辑权限位是怎么算出来的权限问题在 Linux 操作中排在前三的坑。很多新手只记住 chmod 777 能解决一切权限报错却没意识到 777 也把属主、属组、其他人的写权限全放开了在多人共用服务器上是安全隐患。理解数值权限要先记住三组数读 4、写 2、执行 1。chmod 750 /opt/app/scripts/deploy.sh chown -R deploy:deploy /data/www umask 022chmod 750 拆开看7421属主可读可写可执行541属组可读可执行0其他人无权限。我一般给可执行脚本配 750配置文件配 640静态资源配 644。chown -R deploy:deploy 递归把 /data/www 的属主和属组改成 deploy 用户冒号前是用户后是组。改完属主后应用报错先看属主、属组是否和运行进程的用户一致。权限数值含义r4读取文件或列目录w2修改文件或增删目录内容x1执行文件或进入目录umask 022 决定新建文件的默认权限文件默认 666 减去掩码得到 644目录默认 777 减去掩码得到 755。在为用户创建家目录的脚本里先把 umask 设置好再执行 mkdir否则容易出现其他人可写目录的告警。4.2 ps/top/kill找进程、看资源、发信号进程管理最考验组合命令的熟练度。直接 kill -9 杀不掉的进程不代表它真的无解反而可能是你定位错了对象。正确做法是先用 ps 找到准确的 PID确认对象后再选合适的信号。ps -ef | grep java | grep -v grep | awk {print $2} top -b -n 1 -o %MEM | head -20 kill -HUP 12345第一行是经典组合ps -ef 输出全格式进程列表grep java 筛选含 java 的行grep -v grep 剔除 grep 自身awk {print $2} 取出 PID。面试中经常考这条实际使用要注意如果进程用户名字过长ps -ef 的 PID 列可能不是第 2 列这时用 ps -eo pid,user,cmd 显式指定列更稳。第二行 top -b -n 1 -o %MEM 以批处理只跑一轮按内存占用排序适合放到脚本里定时采集。第三行 kill -HUP 对 nginx 这类守护进程会触发配置重载而不是终止进程这是“改配置不用重启”的常用姿势。4.3 systemctl服务启停与开机自启主流 Linux 发行版都用 systemd 管理服务systemctl 的常用命令必须形成肌肉记忆。一条命令就能完成启停、开机自启、查看状态的全套操作。systemctl enable --now nginx systemctl status nginx --no-pager -l journalctl -u nginx --since 1 hour ago -fenable --now 把开机自启和立即启动合并成一步比分开执行少一个状态窗口。status 默认调用分页器脚本里会卡住--no-pager 关闭分页-l 让长行完整显示。journalctl -u nginx 查看 nginx 的日志--since 1 hour ago 限定最近一小时-f 实时跟随。服务启动失败时先 status 看错误再用 journalctl -u 服务名 -n 50 看最近 50 条日志。这里有个常见误区改了服务配置文件后必须 systemctl daemon-reload 重新加载单元定义否则 systemd 用的还是内存里的旧配置这个细节很容易在忙乱中被漏掉。4.4 环境变量与 PATH命令找不到时的排查顺序遇到 command not found不要急着装软件先确认这条命令是不是存在于某个不在 PATH 里的目录。常见做法是用 which、type 或者 echo $PATH 按顺序排查。echo $PATH which nginx export PATH$PATH:/usr/local/bin第一行看当前 PATH 包含哪些目录。第二行 which 查命令实际路径能查到说明命令存在只是当前 shell 没找到。第三行把 /usr/local/bin 追加到 PATH只对当前 shell 生效想持久化要写进 ~/.bashrc 或 /etc/profile。排查顺序我一般固定是先 which 确认命令是否存在再 echo $PATH 看目录最后看是不是 sudo 重置了 PATH。shell 启动时加载的是 /etc/profile 还是 ~/.bashrc跟登录方式有关脚本里如果发现环境变量对不上先确认脚本执行方式和当前 shell 是否一致。5. Linux 常用命令避坑指北5 个翻车现场与排查思路5.1 rm -rf 误删后的后悔药先建别名还是先备份现象脚本里写了 rm -rf $path变量因上游解析失败变成空值执行时变成 rm -rf /整个目录树被删除。原因rm -rf 没有对参数做合法性校验空变量直接导致命令作用于根目录部分发行版默认开启 rm 的根目录保护但并非所有环境都这样。解决先在 ~/.bashrc 里加 alias rmrm --preserve-root让 rm 拒绝删除根目录这是成本最低的第一道防线。脚本层面删除前先做存在性和路径前缀检查test -n $path [[ $path /tmp/* ]] 再执行。生产环境文件建议提前做异地备份备份不要放在同一台机器同一块磁盘上。第一次被 rm 误删之后我才意识到 alias 和路径白名单比任何事后恢复工具都可靠。5.2 grep 过滤进程把自己也筛进去现象ps -ef | grep java 的输出里总是多出一行 PID 很小的 grep 进程脚本里的进程数量统计被带偏。原因grep 要匹配的关键字“java”出现在它自己的命令行里ps 的输出包含正在执行的 grep 命令本身。解决在过滤条件后追加 grep -v grep 去掉自匹配行或者直接用 pgrep -l java。常见做法是写成 ps -ef | grep [j]ava利用正则字符类让 grep 进程的命令行里不再包含完整的“java”字面量。这条坑在日志搜索里同样会发生grep 一个刚执行过的命令关键字结果里混入当前 shell 的信息排查时多看一眼输出里的进程名就能识别。5.3 sudo 也提示 command not foundPATH 被重置了现象当前用户直接执行 /usr/local/bin/xxx 正常加 sudo 后反而提示 xxx: command not found。原因sudo 出于安全会用 secure_path 重置 PATH默认不包含 /usr/local/bin用户自定义安装的可执行文件因此找不到。解决不要用 sudo xxx 这种写法改用 sudo /usr/local/bin/xxx 绝对路径执行或者在 /etc/sudoers 的 Defaults secure_path 里追加 /usr/local/bin。装源码包编译软件后这个现象尤其常见。sudo su - 与 sudo su 也有区别带 - 会加载 root 的登录环境不带 - 保留原环境脚本里用 sudo 执行带路径依赖的命令时环境不一致经常导致行为差异。5.4 awk 里用 shell 变量直接变成空值现象在 awk 里写 awk {print $HOME} 输出空想用外部变量过滤日志日期变量永远不生效。原因awk 的单引号内部由 awk 自己解析$HOME 被当成 awk 的字段引用而不是 shell 变量。解决用 -v 参数把 shell 变量传进 awkawk -v home$HOME {print home, $1}。多个变量可以连续写 -v a$A -v b$B。管道命令里想用 date 生成的日期做过滤时先把日期存成 shell 变量再通过 -v 传入这是文本处理里最容易让人对着输出发呆的细节。5.5 journald 日志吃满磁盘常规清理无效现象服务器磁盘告警df -h 显示 /var/lib/journal 占用异常按常规删除 .log 文件后空间没有明显释放。原因systemd-journald 默认把日志存在 /var/lib/journal 的二进制 journal 文件里普通日志清理工具不会覆盖它。解决先用 journalctl --disk-usage 查看占用再用 journalctl --vacuum-size200M 把日志压缩到 200M 以内或在 /etc/systemd/journald.conf 设置 SystemMaxUse200M 后执行 systemctl restart systemd-journald。直接删除 journal 目录里的 .journal 文件有损坏当前正在写入文件的风险应该用 vacuum 系列命令。这类坑的典型特征是“df 显示某个目录很大du 却找不到大文件”。5.6 把这些坑串起来一次日志排查的完整链路用一个真实场景收束上面几条某服务告警无响应。第一件事是 top -b -n 1 看 CPU 和内存发现 java 进程占用异常接着 ps -ef | grep [j]ava 拿 PID用 ps -o pid,ppid,etime,%cpu 看进程存活时长日志集中在 journald 里执行 journalctl -u 服务名 --since 30 min ago --no-pager 查报错定位到是配置路径不对改完配置后执行 systemctl daemon-reload 再 restart。整个过程用到的全是常用命令难点不在单条命令而在判断顺序先看资源再看进程最后看日志按这个链路走不会漏。排查完成后把命令整理进 ~/ops/ 目录下次同类问题直接翻历史脚本比重新敲一遍可靠得多。6. 从单条命令到一键巡检组合命令与脚本化收尾6.1 history 与快捷引用减少重复输入单条命令的边界在重复操作上暴露得最明显。登录服务器后接续之前的操作我习惯用 history 配合快捷引用把重复成本降下来。history | grep docker restart | tail -10 !1123 !$history 输出带编号的命令记录grep 加上服务名定位之前执行过的完整命令。!1123 直接重执行编号为 1123 的这条命令!$ 引用上一条命令的最后一个参数。注意 history 在多个终端会话下默认不同步想全局共享可以把 PROMPT_COMMAND 配置成实时写入 history 文件。6.2 一个还能继续扩展的巡检脚本#!/bin/bash # 系统健康巡检保存为 /usr/local/bin/healthcheck.sh 后执行 chmod 750 echo 磁盘使用率 df -h | grep -vE ^(Filesystem|文件系统)|tmpfs echo 内存使用 free -h | awk NR1 || NR2 echo 系统负载 uptime echo 失败的系统服务 systemctl --failed --no-pager这个脚本把前面的命令组合成一次巡检动作df 过滤掉文件系统头行和 tmpfsfree 只输出表头和 Mem 行uptime 看 1/5/15 分钟负载systemctl --failed 列出启动失败的服务。放到 /usr/local/bin 并授予 750 权限后每天登录先跑一遍能比单独敲命令更快感知服务器状态变化。后续要扩展可以把输出追加到带日期的日志文件配合 grep 做历史对比也可以加 if 判断磁盘使用率超过 90% 时用 curl 调用告警接口。6.3 验证命令是否生效echo 与 set -x 的调试习惯脚本里最怕“执行了但没生效”。我的习惯是在关键操作前加 echo 打印将执行的语句调试时在脚本第一行写 set -x 让 bash 逐条打印实际执行的命令变量展开后的真实值一眼可见。排查完再把 set -x 去掉保留 echo 提示。用脚本管理这些常用命令最大的好处是每次排查过程都变成可复现的步骤而不是依赖命令行肌肉记忆。今天这篇笔记里的命令组合也一样不必执着于背选项先把最常用的几组命令用熟在真实服务器上把参数边界试过一遍比对照着 Linux 常用命令大全式资料死记硬背有效得多。希望帮到你。本文还有配套的精品资源点击获取
返回列表