ARTICLE DETAIL

资讯详情

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

Linux基本指令不用背:理解命令行逻辑,半小时掌握核心用法

Linux基本指令不用背:理解命令行逻辑,半小时掌握核心用法 没接触Linux之前很多人以为学Linux就是要背一大堆指令。真上手之后才发现指令是背不完的今天记住了明天就忘换个发行版又有一堆新命令。我在带新人和自己摸爬滚打的过程里慢慢琢磨明白一件事Linux的基本指令根本不需要死记硬背你需要的是理解命令行背后的逻辑然后顺着逻辑去用用多了自然就长在肌肉里。这篇文章就从一个实际使用者的角度把这些基本指令掰开揉碎讲清楚不仅告诉你每条命令怎么用还会告诉你我踩过的坑和摸索出来的思路。不管你是刚准备入门、在准备面试还是想系统补一补基础知识这篇都值得你花十分钟好好看看。1. 为什么你学指令总是学了就忘先修正这套底层认知1.1 命令的本质程序、选项和参数的三元关系很多人把命令当成一套神秘的咒语其实Linux命令的构成特别朴素就是一个可执行程序的名字加上若干选项Options和参数Arguments。比如ls -l /homels是程序名-l是选项/home是参数。程序名决定这条命令要做什么选项告诉它怎么做参数告诉它对谁做。我见过不少初学者卡在这里为什么有些选项前面是一条短横线如-l有些是两条如--all这其实是历史上两套风格并存的结果。短横线短选项适合日常组合使用长选项的含义更清晰适合写进脚本让人一眼看懂。比如ls -a和ls --all是一个意思但新手看--all显然更容易理解。这并不是说你必须全都记住而是你要明白ls -l里的-l如果换成长格式就写作--formatlong这么一对应很多命令就不再是零散记忆了。同样重要的是理解--help和man是干什么的。我见过太多人一遇到记不清的命令就百度效率极低。Linux自带的帮助系统完全够用你敲ls --help试试终端里会直接吐出ls的完整说明配合grep还能精准过滤。这是所有命令都会提供的说明书学会看帮助你就不再依赖别人给你整理命令清单了。1.2 一切皆文件Linux里没有那么多对象Windows用户刚转过来时最大的认知障碍是设备磁盘进程这些东西到底在哪。Linux的理念是八个字一切皆文件。你的硬盘、键盘、网络接口、正在运行的进程在系统里都有对应的文件路径。举个我常说给新人的例子/dev/sda是你的第一块硬盘/dev/null是一个黑洞设备文件你往里面丢什么都被吞掉。在Linux里想清空一个日志文件很多人会先删再建其实直接cat /dev/null app.log就行原因就是/dev/null是个文件重定向也只是一次文件写操作。理解了一切皆文件你就会发现很多命令其实是相通的既然设备是文件那操作设备可以用文件操作命令既然进程信息在/proc目录下那cat /proc/cpuinfo就能直接查看CPU信息。这个认知的价值在于当你遇到一个没见过的问题时能更快地推断出排查方向。比如网卡突然不通了你第一个想到的不应该是某个专门的调试工具而是ip addr show——它只是在读设备的网络配置文件而已。工具虽然不同背后逻辑相通。1.3 管道与重定向把零散指令串起来的粘合剂单条命令再强大也只是一个小工具。Linux真正强大的是把命令串起来用。管道符号|的作用是把前一条命令的输出直接送给后一条命令当输入。比如我想看当前目录下最大的5个文件ls -l输出的是带大小的文件列表那我可以用ls -l | sort -k5 -rn | head -5先用sort按字节数排序再取前5行。这种组合拳才是基本指令真正体现威力的地方。重定向则是把命令的输出写到文件里。是覆盖写是追加写。比如echo hello test.txt会新建或覆盖test.txtecho world test.txt则在后面追加一行。我遇到过不少把和搞混导致日志被清空的案例所以在这里特别提醒重定向符号离重要文件远一点真要覆盖前先确认文件有没有价值。管道和重定向的价值在于让单条命令的输出不再只是看个结果而是可以成为后续处理的数据源。这也是为什么Linux运维效率高的原因同样的任务在Windows上可能要点十几下鼠标在Linux下一行命令就搞定了。2. 求助系统是你随身携带的师傅man、help与检索命令2.1 man手册的正确打开方式man命令是Linux里最值得依赖的工具没有之一。它提供的是完整的参考手册甚至包含命令的历史、退出状态、相关文件等细节。我第一次带新人时总会让他们养成一个习惯遇到没见过或不熟悉的命令先man一下别急着上网搜。但man手册本身也有需要适应的阅读方式。默认是分页展示按q退出按空格或f下一页按b回上一页按/加关键词可以搜索。比如你在man ls的界面里输入/size它会直接跳到第一个含size的行。这几个操作记住你就能在手册里自由穿梭了。man手册还分章节man 1 ls是用户命令man 5 passwd是配置文件格式man 8 mount是系统管理命令。大多数时候直接man ls就行但如果man 5 passwd和man 1 passwd内容差很多那是因为第一章是命令用法第五章是配置文件格式。搞混的话你可能会在查一个文件的配置说明时看到一堆命令选项然后一头雾水。2.2 知道自己敲的是什么type、which、whereis有时候你明明敲了个命令系统却提示command not found你说这命令我昨天还用得好好好的怎么今天就没了这时候就需要用type和which来搞清楚状况了。type能告诉你一个命令是内置命令shell自带的比如cd、外部命令有独立可执行文件、别名还是一个函数。这对排查命令行为不如预期特别有用。我就遇到过同事在bashrc里给ls设了别名lsls --colorauto结果在脚本里调用ls时行为和他以为的不一样用type ls一眼就看穿了。which则是查找可执行文件的位置比如which python3输出/usr/bin/python3。如果你装了多个版本的Python用which就能确认当前默认调用的是哪一个。whereis更进一步它不只找可执行文件还会找源代码和man手册的位置排查命令存在但man打不开这类问题时很实用。2.3 忘记命令名时怎么搜apropos这是我最喜欢向人推荐的一个指令但知道的人确实不多。假设你想查一个命令作用是修改文件的时间戳但你记不住它叫touch这时候你可以在终端敲apropos modify file timestamp系统会扫描所有man手册的描述返回所有匹配的命令。apropos的检索词支持正则也可以配合man -k使用两个是同一功能。这个命令的价值在于它把我忘了命令叫什么和我记得这个命令能干什么之间架了一座桥。运维场景里你不可能记住所有命令但apropos能在你记忆模糊时帮你精准定位。我个人的习惯是遇到一个新的工具类命令先apropos看看系统里有没有类似的工具而不是急着上搜索引擎。3. 文件和目录操作的日常兵器从导航到增删改查3.1 路径是基本功绝对路径、相对路径与cd的隐藏技巧文件操作第一课是路径。绝对路径从根目录/开始写比如/etc/nginx/nginx.conf含义明确适合写脚本时用。相对路径是相对于你当前所在目录的路径比如cd ../conf省略了一长串前缀交互式操作时更高效。这两者的核心区分就是开头有没有/。cd命令有三个高频用法值得记牢cd不带参数直接回当前用户的家目录cd -回到上次所在目录在切换两个目录频繁对比时会省很多事cd ..回到上一级目录。在路径里.表示当前目录..表示上级目录~表示当前用户的家目录~用户名表示指定用户的家目录。搞懂这几个符号你基本不会在路径上迷路。我自己在带新人时发现很多人的问题出现在相对路径和绝对路径混用上。比如在/etc目录下习惯性地敲cd /var/log没问题但如果改成cd var/log在当前目录没有名为var的子目录时就会报错。建议刚开始时多敲绝对路径等熟悉了目录结构再用相对路径提速。3.2 查看目录内容ls和它的高频选项组合ls绝对是使用频率最高的命令之一但很多人就停留在ls和ls -l。其实ls的组合选项能帮你快速提取很多信息。ls -l是长格式显示权限、属主、大小、修改时间ls -a显示隐藏文件以点开头的文件ls -h把文件大小显示成人性化的 K/M/G不再是一长串字节数ls -t按修改时间排序ls -S按文件大小排序。我最常用的一个组合是ls -lht长格式、人性化大小、按时间排序一眼就能看出最近改动的文件和最大的文件是谁。如果目录特别大比如/var/log我还会加上| head只取前几行避免刷屏。注意ls -l和ls -l --colorauto的输出风格不同发行版默认一般会给ls设置颜色别名但也有人关掉颜色这纯粹是个人偏好不影响功能。还有个容易踩的坑ls后面接了目录路径和非目录文件输出格式是不同的。比如ls /etc /etc/hostname前一个参数是目录会列出目录下所有文件后一个参数是文件会列出这个文件本身。刚接触时容易误以为ls /etc/hostname会显示文件内容其实那要cat来干。3.3 创建、移动、复制与删除cp、mv、rm的安全边界mkdir创建目录-p参数可以一键创建多级目录比如mkdir -p /tmp/a/b/c。touch则是创建空文件或刷新已有文件的修改时间。两者一个管目录一个管文件配合使用能快速搭建实验环境。cp复制时最需要注意的是-r递归复制目录和-a归档模式保留权限、属主、时间戳等。我总是在新人的代码里看到cp -r但如果你是在备份配置文件强烈建议用cp -a而不是cp -r因为cp -r不会保留权限位拷过去的文件权限可能全变了服务起不来你都不知道为什么。mv的语义分两种在同一文件系统内它是重命名瞬间完成跨文件系统比如从/tmp移到/home时它实际上是复制删除原文件。这个区别在实际操作中会很直观地体现出来跨设备移动大文件时你会看到明显的进度等待这时别以为卡死了。同理mv覆盖文件前不会反复询问如果你希望它有提示可以加-i。删除命令rm是事故高发区rm -rf更是江湖人称删库跑路标配。我不反对使用rm -rf但强烈建议遵循三个原则一是尽量不直接用rm删除重要数据先移动到/tmp观察几天二是给rm设置别名alias rmrm -i让自己强制确认三是在当前目录下删除前先pwd确认自己身在何处。我见过不止一次人在/home/work下敲rm -rf *结果因为路径变量拼写问题把整个项目目录清干净的案例那滋味真的很酸爽。3.4 软链接与硬链接把文件指针讲明白ln命令用来创建链接最常用的是软链接符号链接用法是ln -s 源文件 链接名。软链接类似于Windows的快捷方式链接文件里存的是目标文件的路径目标文件被删除后软链接就失效了。硬链接则不同它指向的是同一个inode相当于同一个文件的多个名字任何一个名字删掉文件数据还在直到最后一个名字删掉才真正释放空间。用ln不加-s创建的就是硬链接。因为本质不同硬链接不能跨文件系统创建也不能对目录创建而软链接没这些限制。实际运维里软链接的使用频率远高于硬链接。比如升级软件版本时保留旧版本文件把新版本目录软链到固定路径/usr/local/nginx切换版本只需要改链接指向不用动服务配置。这个思路值得借鉴宁可多建软链接也别乱复制一堆同名文件省得改错。4. 文本处理是运维的看家手艺查看、筛选与统计4.1 查看文件内容cat、less、head、tail的正确取舍cat是最基础的查看命令但它的定位其实是拼接文件并不适合查看大文件——几十万行的日志用cat直接刷屏你根本看不完。这时候应该用less它可以分页查看还支持上下翻页和搜索是真正为阅读大文件设计的。用cat还是less我给自己定的规矩是文件少于一百行用cat多于一百行用less。head和tail分别取文件的头部和尾部tail -f更是日志排查的利器。所谓-f就是follow文件内容更新后它会自动滚动增量展示眼见为实看日志从无到有是排查服务启动问题的常用姿势。tail -n 20可以指定显示最后20行查看最新的报错信息用它就对了。4.2 筛选与统计grep、sort、uniq、wc的组合玩法grep是文本搜索的王者基础用法是grep 关键词 文件。但只掌握基础的grep远远不够我在排查问题时的常用组合是grep -i忽略大小写、grep -v排除匹配行、grep -n显示行号、grep -r递归搜索目录。比如我想找出配置里所有被注释掉的项可以grep -v ^# nginx.conf想在项目目录下定位某个函数出现在哪些文件里可以grep -rn funcName ./。sort用于排序-n按数值而不是字典序排序这问题很隐蔽字典序里10排在2前面-r倒序。uniq用于去除相邻重复行注意它只能去掉相邻的重复行所以通常要先sort再uniq。wc计数wc -l统计行数wc -c统计字节数。把这三个命令串起来能完成非常实用的统计。比如统计一个访问日志里哪些IP访问次数最多awk {print $1} access.log | sort | uniq -c | sort -rn | head -20。awk默认按空格拆分每一行取出第一列IP然后排序、去重并计数、再按计数倒序排、取前20。这一行命令在Windows下可能需要写个小程序。这就是组合拳的威力。4.3 sed和awk入门级用法解决八成的行编辑需求很多新人一听到sed和awk就头皮发麻其实入门只需各掌握两三个功能。sed是流编辑器我日常用得最多的是替换比如就地替换配置文件里的IPsed -i s/192.168.1.1/10.0.0.88/g app.conf-i表示直接写入文件小心没有备份建议先替换到屏幕确认再-i。还有删除行sed -i /^#/d app.conf能删掉所有以#开头的行。awk则更适合按列处理基础用法是awk {print $1} file取第一列和awk -F: {print $1} file指定冒号作分隔符。配合条件判断能实现打印年龄大于30的行这种需求awk -F: $3 30 {print $1, $3} file。我的建议是别一开始就追求精通sed和awk的全部语法先把替换、取列、按条件过滤这三个场景练熟等真有复杂需求了再看看GNU文档。做运维的时间长了你会发现八成的文件编辑需求用这四个命令就能覆盖剩下的再老实编辑文件或写脚本。5. 权限模型必须一次说透属主、属组与其他人5.1 ls -l的前十位字符到底在说什么在Linux里看权限最直观的就是ls -l输出左边的10个字符比如drwxr-xr-x。第一位的d表示这是一个目录-是普通文件l是软链接后面九位每三位一组分别是属主u、属组g、其他人o的权限每位对应的分别是读r4、写w2、执行x1。哎这里有个知识点很关键目录的执行权限与文件的执行权限含义不同。目录的x权限表示能否进入这个目录cd进去r权限表示能否列出目录内容。所以一个目录如果只有r没有x你能ls看到文件名但cd进不去更别提访问里面的文件了。这个细节我在排查权限问题时遇到过不止一次。权限的数字表示法基于上面的权重r4w2x1。chmod 754 file的含义就是属主7rwx421、属组5r-x41、其他人4r--只读。数字法的好处是简洁符号法chmod ux file、chmod o-w file的好处是只动某一类权限更精准。两种都得会用现实中两种写法混用很常见。5.2 chmod、chown、chgrp的分工chmod修改权限位chown修改属主chgrp修改属组。这三者经常被混淆。记住了权限位rwx管的是谁能访问属主属组管的是这个东西是谁的。一个经典场景你解压了一个项目包运行脚本时提示 Permission denied但你看文件的权限明明是-rw-r--r--。原因很可能是这个文件的属主是root而你在用普通用户操作。这时需要chown -R 用户名:组名 /路径把所属关系改过来。特别提醒递归修改用-R否则只改顶层目录子目录和文件还是原样问题不会根治。关于为什么不要上来就chmod 777777是任何人可读可写可执行这会让系统失去最基本的权限隔离。一个木马或者错误操作就可能在你的项目目录里制造一个可执行文件然后被宿主机上的任意用户执行。我在生产环境里见过因为777导致的上线事故所以自己写运维脚本时权限一律最小化文件644目录755需要写文件的地方单独给写权限。5.3 sudo、su与普通用户的正确姿势su切换用户最常遇到的是su -还是su的区别su -会同时切换环境变量和当前目录类似于重新登录su则保留当前环境。实际运维中切root时几乎总是用su -否则你会发现自己PATH里找不到ip这类和管理员环境相关的命令。sudo则是用别人的身份执行单条命令最常见的用法是sudo command。它比su安全的地方在于不需要暴露root密码只授权特定的用户执行特定的命令。把用户加入sudo组Debian/Ubuntu下是usermod -aG sudo 用户名CentOS/RHEL系是usermod -aG wheel 用户名。这里的-aG的-a是追加append如果不加会把用户从其他附加组里踢出去这个坑我也踩过。给新人的建议是能用sudo解决的事不要轻易切root日常操作中保持普通用户身份需要提升权限时再sudo。这样即便你敲错了rm命令也不会把系统文件愉快地全删光。6. 把基本指令串成排查链路一个现实场景的完整复盘6.1 场景引入服务器突然变慢你能在一分钟内给出方向吗我见过太多这样的画面网站突然变慢新人登录服务器第一反应是top这没错然后盯着top的输出发懵不知道下一步该干嘛。其实基本指令的价值在于你能按顺序完成一套排查链路。首先用uptime看系统的平均负载load average注意三个数值分别代表1分钟、5分钟、15分钟的平均负载。如果1分钟负载远高于15分钟说明是最近才突然高起来的如果三个都高可能是长期负载就高只是现在更明显了。接着用top看CPU占用排行榜重点关注 %CPU 和 %MEM 两列。看到某个进程CPU飙高直接记住它的PID然后用ps aux | grep PID看这个进程的启动命令、运行用户和完整参数。这一步能帮你快速判断是正常业务程序在跑还是被人植入了挖矿进程。如果top里CPU不高但系统依然卡那就得看内存free -h展示内存总量、已用、可用和交换分区。swap长期占用过高说明物理内存不足需要排查是否存在内存泄漏。再看磁盘df -h看文件系统占用率du -sh 目录看具体哪个目录吃掉了空间。很多“系统卡”的cases最后都归结为磁盘满了特别是日志目录/var/log夸张时一个日志文件就能占满几十G。6.2 网络排查三板斧ip、ping、ss网络问题排查也有固定套路。第一步ip addr确认网卡地址和状态IP有没有配好网卡是不是UP状态第二步ping网关和外部地址先确认链路通不通。ping不通外网但能ping通网关是出口路由或DNS的问题ping都不同就得检查网卡、交换机。确认网络通以后下一步是看服务端口是否有在监听ss -lntp-l监听、-n不做域名反解、-tTCP、-p显示进程这个命令是老的netstat的现代化替代。如果端口没在监听说明服务进程没起来如果在监听但外部连不上可能是防火墙规则在作怪Linux下排查防火墙就两个工具iptables -L -n或它的现代版本nft list ruleset以及ufw和firewalld这类前端封装。curl是应用层排查神器curl -I http://localhost:8080只取响应头能快速看返回码是不是200。502、503、504的排查路径完全不同但这些都是后话。基本指令层面你要能做到先用ip确认网络栈再用ping确认链路再用ss确认端口再用curl确认应用响应这一套下来八成网络问题的方向就能锁定了。6.3 日志是最后的见证者journalctl和tail -f如果上面的排查都没发现异常问题可能出在应用自身这时候日志就是你唯一的线索。CentOS 7之前的系统看/var/log/messages之后的看journalctl。journalctl -u 服务名查看指定服务日志journalctl -n 100查看最近100行。配上涨停习惯排查服务反复重启时用journalctl -u 服务名 -f实时跟踪同时手动重启服务看日志输出的关键报错。应用自己打的日志一般在应用目录或/var/log下用tail -f跟踪即可。有时候报错只出现一瞬解决方法是grep -i error 日志文件配合上下文匹配grep -A 5 -B 5 error这样能看到报错前后各5行很多问题的根因就藏在报错附近的堆栈信息里。基本指令用熟了以后你就会发现排查问题本质上就是看状态、看日志、看资源而这三件事靠的都是这些不起眼的日常指令。我自己排查问题的时候九成时间花在观察、对比、定位上真正动手修可能只需要一条指令。这就是基本功的价值。6.4 装完系统必做的第一件事更新软件源每个发行版都有软件包管理工具Debian/Ubuntu系用aptCentOS/RHEL系用yum或dnf。装完系统第一件事永远是更新软件源索引并升级已有包。Debian系是apt update apt upgrade -yRHEL系是dnf update -y。这一步不只是安全需要更是为了避免后面用包管理工具装软件时报依赖错误。说到软件源国内用户经常遇到官方源慢到超时的问题解决办法是换国内镜像源比如把archive.ubuntu.com换成国内源地址这是每个国内Linux使用者都会遇到的问题但我必须提醒换源属于操作系统的正常配置行为也和易用性直接相关。这里我不具体推荐某个源操作时注意先备份原源配置文件比如cp /etc/apt/sources.list /etc/apt/sources.list.bak这算是我在无数教训之后养成的条件反射。另外很多人问我GitHub上有个 bkcrack 要在Linux上装其实本质就是源码编译和三方依赖问题。这类通用场景的标准流程是先apt install build-essential把编译工具链装好再按项目README执行make或cmake。学Linux命令本质上就是学一套解决问题的流程而不是记一条孤立的指令。7. 写在最后的实操建议说了这么多最后分享一点我自己的亲身体会学习基本指令最快的路径不是死记而是带问题去用。我当年刚开始接触Linux时强迫自己把日常操作全部搬到命令行——不看图形界面坚持用cd、ls、grep完成工作遇到不会的就去man和apropos一个月之后基本指令就变成条件反射了。如果你是个新手我建议从今天开始给自己定个小目标每天在终端里待满20分钟环境的初始化、文件的整理、日志的查看都指望着命令行。用不了多久你自然会发现那些曾经觉得很难的指令不过是环境的表达方式早就在不知不觉间用熟了。
返回列表