ARTICLE DETAIL

资讯详情

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

Linux命令基础到实战:核心逻辑、组合用法与避坑指南

Linux命令基础到实战:核心逻辑、组合用法与避坑指南 别把 Linux 命令想得太玄乎。我第一次接触 Linux 那会儿对着黑乎乎的终端窗口脑子里只有“rm -rf 删库跑路”这种段子心里发怵得很。后来被项目逼着在 CentOS 上部署环境、排查线上问题硬着头皮一遍遍敲命令才发现这玩意儿本质上就是一套“和文件、进程、系统打交道”的沟通语法。等你熟起来它比图形界面给你的掌控感强太多了。这篇东西我不想再复读“ls是列目录、cd是切换目录”这种小学级别清单——那玩意你百度一抓一大把。我想用我的实际经验给你拆开揉碎讲讲基本指令背后藏着的设计逻辑、组合思路、还有那些文档不会告诉你的坑。适不适合你如果你刚装好系统对着桌面发呆、或者准备面试前突击基础、又或者工作中时不时得登录服务器看一眼日志这篇应该能帮你少走点弯路。1. 动手之前先把命令的共同底层逻辑搞清楚1.1 所有命令都在同一个套路里命令的通用格式就是命令 [选项] [参数]。注意这个顺序不是我随便写的是约定好的规则。很多新人一上来容易把参数和选项的位置搞反比如写成ls /etc -l这虽然能跑但属于“语法不太干净”实际养成好习惯应该是ls -l /etc。选项的作用是改命令的默认行为-l就是以长格式输出参数告诉命令对谁操作就是目录或文件的名字。选项有两类比如ls -l这种单字符的叫短选项Linux 支持把多个短选项合并ls -la等价于ls -l -a。另一种是长选项比如ls --all功能一样只是为了方便阅读。你写脚本或者在文档里分享命令时尽量用长选项因为别人一眼能看懂你的意图在命令行里临时敲短选项更省事。刚才我给新手讲语法时发现很多人分不清--help和man的区别。--help是命令自带的简要说明几行字重在快速回忆man是完整的操作手册遇到不熟悉的命令直接敲man ls看完了按 q 退出。有时候信息量大得吓人别慌你只需要学会挑“DESCRIPTION”和“EXAMPLES”两段重点看就够了。提示判断一个命令是否存在用which 命令名。我经常用这个排查环境变量配置错了没比凭感觉猜靠谱得多。1.2 一切皆文件这是 Linux 所有指令的哲学地基“一切皆文件”这句话你肯定听过但很多人低估了它对你的实际指导意义。在 Linux 里普通文件、目录、硬盘分区、字符设备、终端输出接口甚至进程之间通信的管道全部被抽象成了文件。也就是说你操作它们的语法是高度统一的能用读文件的方式获取系统信息能用写文件的方式下发配置。这就是为什么你查看 CPU 信息不用装第三方工具直接用cat /proc/cpuinfo就能看到一堆硬件参数。目录本身也是一个文件它记录着存放在里面的文件清单和索引信息。理解了这一层你再看后面我讲的所有操作都会有一种“原来如此”的通透感而不是死记硬背。1.3 命令从哪来关于PATH和环境变量你有没有好奇过每次敲ls系统怎么知道去哪找这个程序答案就是 PATH 环境变量。它是一串以冒号分割的路径列表系统会按顺序在这个列表里找命令的可执行文件。用echo $PATH能把这个列表打出来。如果有一天你执行某个命令系统提示 “command not found”而你sure命令是装了的那大概率是 PATH 里没有包含它的安装路径。比如我装完某软件后经常要执行export PATH/usr/local/myapp/bin:$PATH把它加进去但注意这个 export 只对当前终端会话生效关掉窗口就没了。想永久生效得写进/etc/profile或者用户目录下的.bashrc文件。1.4 命令行的Tab补全让效率翻倍的隐藏技能我要单独拎出来说一个不算“命令”但比命令更重要的东西——Tab 键补全。绝大多数 Linux 发行版默认启用了 bash-completion你敲了路径的前几个字母按 Tab 自动补全如果补不出来按两下 Tab 会列出所有可能匹配项。这个习惯我从第一天就强制自己养成敲命令速度提升不是一点点。更妙的是有些命令比如systemctl你按两次 Tab 它会直接列出所有服务名你挑一个回车就行不用死记硬背 UUID 或完整服务名。很多新手觉得 Linux 命令行难一半是因为打字太慢另一半就是因为没用 Tab 补全把自己打字量降下来。2. 文件与目录指令高频操作的核心拆解2.1 定位自己的位置pwd、cd、ls每次登上服务器第一件正事永远是确认自己在哪。pwd输出当前完整路径比如/var/log/nginx。然后是cd注意几点cd不带参数是回到当前用户的家目录cd -不是回家是回到上一个所在的目录。这个技巧在切换两个较深的目录时特别有用我在部署流程里经常在两个配置目录之间来回检查全靠cd -省时间。cd ..是去上级目录cd ../../就是往上跳两级。ls的进阶用法重点说几个。我默认总是ls -l看长格式它输出的第一列就是权限字符串比如drwxr-xr-x第一个字符 d 代表目录- 代表普通文件l 是软链接。后面 9 个字符三个一组分别对应所属用户、所属用户组、其他用户的读/写/执行权限。ls -lh加了 h 参数文件大小会自动转成 K、M、G 这种人性化格式不然你看到的都是字节数眼里全是数不清的位数。ls -a显示隐藏文件在 Linux 里文件名以点开头的就是隐藏文件比如.bashrc、.gitignore它们不是用来藏秘密的更多是放配置和临时文件省得列目录时满屏都是碍眼。ls -lt按修改时间排序新文件在最上面找刚生成的日志文件时我几乎必用。2.2 实操技巧创建、移动、复制、删除的安全姿势mkdir -p a/b/c这条要重点记。-p的作用就是如果父目录不存在就自动创建否则你得先建 a、再进 a 建 b、再进 b 建 c层层嵌套能把你烦死。写部署脚本时这个命令几乎是标配。复制粘贴时注意了cp和mv最大的不同之处是 cp 会保留源文件mv 直接把它挪走。很多人不知道mv 在同文件系统内操作只是改个指针速度极快代价几乎为零但如果是从一块磁盘挪到另一块磁盘它本质上是先复制再删除速度慢期间如果断电或者磁盘故障中间状态会很尴尬。所以在做大数据量迁移时我宁可先rsync完事后校验一遍再手动删除源文件。删文件用rm但rm -rf是很多人玩脱的开始。-r递归删除目录-f强制忽略不存在的文件和不询问。这个组合极度危险尤其当你用 root 身份操作时——没有回收站没有二次确认删了就是你系统的损失。我的原则是生产环境用 root 时敲rm -rf前必须把命令完整写出来然后回车前逐个字符确认一遍路径必要时先在路径前加./或绝对路径绝不用那种rm -rf /tmp/abc/*后面跟着一堆通配符的写法。2.3 看文件内容cat、less、head、tail各司其职cat适合看短文件比如配置文件、几个变量的环境变量文件。直接用cat /etc/os-release能快速确认系统发行版版本。但文件一长cat 刷屏会让人抓狂。这时候用less看它可以上下翻页、按/搜索关键字、按n跳到下一个匹配项而且它不像vi那样有模式切换的认知负担。很多人问我less 和 more 有啥区别more 只能往下翻less 上下都能翻且启动更快。至于tail它是追日志的神器tail -f /var/log/nginx/access.log实时刷新。加-f后终端会一直保持跟踪文件新增的内容线上排查问题的时候开着它看流量进来没有比刷新网页看监控台直接多了。-n 100可以指定显示最后 100 行适用场景是日志文件太大你今天只关心最近一段时间的记录。2.4 搜索文件的两种思路find和grep的边界很多人把find和grep混在一起其实它们的职责完全不同。find是搜文件名grep是搜文件内容。排查问题的时候我经常两招连用先 find 定位到日志文件在哪个路径再 grep 从里面挖关键字。find /var -name *.log就是找 /var 目录下所有 .log 结尾的文件。注意-name用的是模式匹配不是正则*和?是通配符这点很多人踩坑以为能用.*写正则结果怎么都匹配不到。另一个高效的是find . -type f -mtime -1找当前目录下最近 24 小时被修改过的文件。部署完后用到这个能快速看到哪些配置文件被程序改过了定位问题非常有用。3. 权限、用户与进程指令绕不开的基础管理3.1 权限模型读、写、执行到底是什么前面已经提过ls -l第一列是权限字符串现在我展开讲透。还是拿drwxr-xr-x举例第一个字符 d 表示目录类型。后面的rwx分别代表读(4)、写(2)、执行(1)。三组权限位置是不能变的依次是文件属主u、属组g、其他用户o。这里最容易被忽略的是目录的读和执行权限和文件不一样。目录没有执行权限你是进不去的会提示 Permission denied这和你有没有读权限没关系。读权限控制你能不能列出目录里的文件名执行权限控制你能不能穿过该目录到达它的子目录和访问里面的文件。很多新手配网站目录时只改了文件的权限忘了给父目录加上可执行权限结果 NGINX 或者 PHP-FPM 总是访问不了就是这个原因。3.2 chmod和chown数字权限和属主变更chmod是改权限的最主要命令。我推荐用数字形式它直观且不容易出错。计算规则是r4, w2, x1, 每组三个权限的数值相加。比如 7421rwx642rw541r-x。常见组合有目录建议 755表示属主可全操作其他人能读和执行但不能写。普通文件建议 644属主可读写其他人只读。如果是脚本文件必须加上执行权限chmod x deploy.sh。chmod -R 755 /path/dir里的-R表示递归应用到目录下所有子文件和子目录但用的时候要小心它会一把梭把所有文件都改成可执行。对于网站上传目录我更推荐单独对目录 755、对文件 644免得出现安全问题。chown是改文件归属比如chown -R nginx:nginx /usr/share/nginx/html部署网站后经常要做这一步不然 Web 服务没有权限读写。3.3 用户切换与sudo别总用root裸奔在服务器上裸奔用 root 是大忌一旦手滑没有权限缓冲层保护你。日常操作应该用普通用户需要提升权限时用sudo。sudo的意思是让系统临时以管理员的身份执行当前这条命令。注意用法sudo cat /etc/shadow能读文件但cat /etc/shadow | sudo tee newfile和sudo cat /etc/shadow newfile的效果完全不同——重定向符号是当前用户的 shell 处理的不是 sudo 后的权限。你要把文件内容写入需要 root 权限才能写的路径得注意这个坑我最初的几年在这上面栽过不止一次。切换用户用su - username注意那个-不能漏它表示同时切换到一个干净的用户环境否则你会保留上一用户的环境变量排查问题时偶现一些“灵异现象”。3.4 进程查看和结束ps、top、kill的配合看当前有哪些进程在跑用ps -ef或者ps aux两种风格都行。我习惯用ps aux它的输出里包含 CPU 和内存占用率找哪些进程吃了大量资源一眼可见。ps aux | grep nginx是经典的组合命令先列出所有进程再从结果里筛选出包含 nginx 关键字的行。这里有个新手常遇到的困惑grep 那一行本身也会出现在结果里因为 ps 列出进程时包含了正在执行的 grep 命令。一般看到grep这个进程在列表里就说明匹配成功了。结束进程用kill后面跟 PID进程号。温柔的先发 SIGTERM默认让进程自己清理退出万一进程挂死了或者不响应才考虑kill -9强杀这是直接发 SIGKILL 信号让内核直接干掉它不留给进程任何善后机会。用它杀数据库进程时如果运气不好正好赶上写盘中途可能出现数据不一致的风险所以强杀永远是最后手段。查看系统整体负载用top按 P 按 CPU 排序按 M 按内存排序按 q 退出。如果不想交互式地开一个全屏界面就用top -n 1 -b一次性输出当前快照。4. 文本处理和管道命令组合出的强大能力4.1 管道符“|”让一条命令的输出变成另一条命令的输入这个符号是整个 shell 最妙的设计之一。它的作用就是把前一个命令的标准输出接到后一个命令的标准输入。我举一个最简单的例子cat access.log | grep 500 | wc -l这个组合的含义是读日志文件挑出包含 500 错误的行然后数一数总共有多少行。没有管道的话你得先存中间结果到临时文件再读临时文件三个命令要分三次执行。管道是一条用命令砌出来的流水线每一步处理完的数据直接传给下一环节。这条流水线思维是 Linux 基本指令的高级用法学会它你才能脱离“背命令”的层面进入“组合解决问题”的层面。4.2 grep、sed、awk文本处理“三剑客”怎么选grep是查找文本行适合“从大堆日志里揪出关键词周围的信息”。常用参数背熟这几个-i忽略大小写-v反向匹配排除掉包含关键词的行-E启用扩展正则-n显示行号。比如grep -n ERROR app.log直接带着行号输出错误日志排查代码定位时特别有用。sed是流编辑器擅长对文本做替换和删改。sed -i s/oldstring/newstring/g config.conf这个命令是直接改文件。注意-i是关键它是真的写回文件不加-i的话只会打印修改后的结果文件本身不变。以前我总觉得 sed 语法难记后来想通了只需要牢牢记住替换模式s/旧/新/这一招大多数需求就够用了。想删除某一行sed -i /debug/d file.txt意思是删除包含 debug 的那一行。awk是更强大的文本分析器它的默认逻辑是按空白符把每一行拆分成字段然后通过$1、$2引用第一个、第二个字段。我常用的需求是ps aux | awk {print $2, $11}意思是提取进程 PID 和它对应的可执行文件路径。还可以做累加操作日志里要统计总请求字节数cat access.log | awk {sum $10} END {print sum}这招在找哪个文件占用空间最大时特别顺手。提示三者的选择标准总结下来只用一句话记grep负责挑行sed负责改行awk负责拆行。绝大多数场景先想清楚你到底要挑还是要改还是要拆选对应的工具就行了。4.3 组合实战案例一行命令排出磁盘占用Top我现在就把刚才讲的命令组合起来给你一个真实的排查场景实例。服务器磁盘警告了先df -h看整体使用率哪个分区满了心里有数。然后du -sh /home/*看 /home 下每个用户目录占了多少空间。再进一步往深处钻du -h /home/user1/* | sort -rh | head -10。这个命令的含义是列出目录下所有文件和子目录的具体大小按大小逆序排列只显示前 10 条。sort -rh里的-r是倒序-h是让 sort 识别 K、M、G 这种人类可读单位。如果你直接不加-hsort 会按字节数的大小来排序结果很可能是 9G 排到了 1M 后面那个数字是按字母序比较的完全乱了。5. 系统状态与网络排查指令出行前先看仪表盘5.1 系统信息三件套uname、df、du、freeuname -a一条命令输出系统的内核名称、主机名、内核版本、硬件架构。排查环境问题时经常要确认系统是 x86_64 还是 aarch64这直接影响你下载什么架构的安装包。df -h看的是文件系统层面整个磁盘分区的使用率一目了然du看的是目录层面某路径里到底被哪些家伙塞满了。两个命令从不冲突排查时先用 df 定位大分区再用 du 深入目录。内存状况用free -h它的输出里有两块重点Swap 到底用没用如果 Swap 用了很多说明物理内存不够了系统在拿硬盘当临时内存性能已经严重受损另一块是available列这列才是进程实际能用的内存别被free列骗了因为 Linux 区分了文件缓存对应用可见的可用内存会比你从 free 查出来的数字乐观得多。-h参数这次是可选的不过你还是加上吧看着舒服。5.2 网络排查ping、ss、netstat怎么选ping用来测基本连通性注意合理设置次数ping -c 4 baidu.com才是正经用法否则一直 ping 下去跟个复读机一样。它能告诉你网络通不通、延迟稳不稳看 time 这个字段的波动就有数。在系统里查端口监听状态的命令是ss或者老牌的netstat -tlnp。-t只看 TCP、-l只看监听状态、-n用 IP 和数字端口显示不解析主机名、-p显示对应的进程 PID 和程序名。排查端口冲突时用这招服务启动报端口被占用先 ss 查出谁在占用这个端口再决定是停掉旧进程还是换端口。netstat在老系统上很常见但新装的 Linux 发行版很多都不带它了所以我现在优先教ss。5.3 软件包管理yum/apt的日常与封板Linux 有不同的发行版家族一般分成使用 yum/dnf 的 RHEL 系和使用 apt 的 Debian 系。内存里永远留这几个常用命令搜索软件包RHEL 系用yum search 关键词Debian 系用apt search 关键词。安装软件RHEL 系yum installDebian 系apt install。升级全部包用yum upgrade或apt upgrade。需要注意生产环境别有事没事全量升级当系统的 glibc 或者内核被升级后很多第三方应用会不兼容甚至有起不来的风险。我的建议是只安装必要的软件锁住核心组件的版本把升级窗口留给定期的变更管理流程。5.4 定时任务crontab让系统按点干活需要在固定时间运行备份、清理临时文件或者拉取更新用crontab -e编辑当前用户的定时任务。每一行的格式是五个时间字段加一个命令分、时、日、月、周。比如每天凌晨 2 点 30 分执行备份脚本就是30 2 * * * /opt/backup.sh。*表示任意值这个字段我经常解释成“每天、每月、任意星期几都匹配”。排查定时任务为什么没跑第一步看日志——大部分发行版都会把 cron 执行记录写进/var/log/cron第二步检查脚本是否加了执行权限。写crontab -e时建议把所有输出都重定向到一个日志文件比如 /var/log/backup.log 21不重定向的话如果命令有标准错误输出系统会默认发一封邮件给你你又不看邮箱错误就被吞没了。6. 面试高频考点与实战避坑指南6.1 面试官常问的Linux基础题拆解我给不少人做过入职辅导发现面试官问 Linux 基础翻来覆去其实就那么几板斧。第一类查看系统信息的命令uname -a、cat /etc/os-release、free -h、df -h这是送分题。第二类分析日志grep ERROR app.log、tail -f app.log、统计关键字出现次数grep -c。第三类查端口ss -tlnp。第四类找出耗 CPU 的进程top之后按 P或者ps aux --sort-%cpu | head -10注意--sort-%cpu这种写法是 GNU 扩展参数部分非 GNU 环境可能不支持稳妥做法还是 top 里按 P。第五类进程杀不掉怎么办面试官问你“kill -9 杀不掉进程怎么办”考察的是你对 D 状态进程不可中断睡眠的认知——这种情况多半是内核态在等 IO杀不掉正常只能等它自己恢复或者重启机器。我能给的实战建议是面基础岗把grep、awk、sed、find、ps、top、ss这七兄弟练到肌肉记忆基本就稳了。6.2 我踩过的五个经典坑写在这给你排雷第一个坑重定向覆盖 vs 追加。我早年安环境写脚本时总习惯用重定向输出结果忘记这会把原文件内容清空。现在养成习惯关键场景一律用追加或者先输出到临时文件再 mv 覆盖降低事故率。第二个坑du -sh *和du -h --max-depth1的结果对不上。因为前者包含了当前目录里直接可见的子目录的大小后者还考虑了一些隐藏目录。排查的时候两个命令交叉用结论不一致别慌多数是隐藏目录贡献的差异。第三个坑忘记加-x的参数。从网上下载的安装包脚本如果你没加执行权限运行的时候会给你一个 “Permission denied”。那不是脚本有问题是你没有执行权限。解决办法是chmod x install.sh。第四个坑tar解包到哪个目录就可能在哪个目录种下一堆乱文件。养成好习惯先mkdir 新目录把 tar 包挪进去再解压。这样解出来的文件全部落在新目录里后续清理也方便。第五个坑vim里不知道怎么退出。新手经常卡在编辑模式里按Esc退出编辑模式再输入:wq保存退出:q!强制不保存退出。这个梗经典到所有 Linux 教程都会提但我在真实工作里也见过不止一个新手同事卡在这。6.3 安全习惯备份、权限、确认三件套日常例行公事里最重要的安全习惯其实是备份。动任何配置之前先cp xxx.conf xxx.conf.bak改动出问题能直接原地回滚。改系统级配置时甚至在改之前我会有意识地md5sum算一个校验值改完之后再对一下防止出现手误改乱的情况。权限方面遵循“最小权限”原则能不开 root 就不开 root能用 sudo 单条执行就不切到 root 整段会话。操作之前养成二次确认的习惯尤其是rm和mv一条一套检查很多事故都是手滑加满不在乎叠加出来的。7. 从基本指令到脚本思维的进阶路径命令敲得再多也只是停留在“单条操作”层面。我在带新人的时候一直强调基本指令是你的词汇库但语言能力的关键在于你会不会用这些词汇造句进而写成一篇文章。放到 Linux 的世界里这篇文章就是 Shell 脚本。脚本其实并不神秘它无非是把你在命令行敲过的命令按顺序写进一个文本文件再给文件加上执行权限。比如你想每天备份日志先把备份命令整理出来写成backup.sh内容是tar czf /backup/logs_$(date %Y%m%d).tgz /var/log/nginx然后chmod x backup.sh最后用crontab -e定时调用它。这一整套流程里没有出现一个新命令全是基本指令的排列组合但解决的问题量级完全不同。所以我建议你别急着去专门学花哨的脚本语法先把你日常做过的重复性操作记录下有意识地整理成脚本片段用到的时候直接抄进 .sh 文件里跑一遍能出预期结果这就算入门了。再往后可以查看系统的启动日志和开机自启服务systemctl list-unit-files --typeservice能列出所有服务的开机启动状态journalctl -u 服务名能查看指定服务的详细日志。碰到系统级故障时这些命令配合之前的文本处理技巧能帮你快速从几十万行的日志里找出关键错误行定位时间从小时级缩短到分钟级。最后说说我使用几年的心得Linux 命令行最大的门槛不是记不住命令而是不熟悉“把各个简单工具组合成完整方案”的思考方式。你不需要背下所有命令的所有参数你只需要知道有哪些工具存在大概知道它们的风格和边界等实际问题出现时用man去查细节用grep去验证结果。这种能力一旦建立后续不管接触什么新系统、什么新发行版都能快速迁移这套底层逻辑。把上面这些指令多敲几遍很快你也会习惯在黑框框里解决工作里的各类问题。经验上的差距没法速成但也别把它想成开山劈石般难无非是你今天多敲几条明天多踩几个坑后天回来看说不定那个曾经让你停下来抓耳挠腮的问题只需要一条管道命令就轻轻松松带过了。
返回列表