Linux常用指令入门到精通:从Shell原理到文本处理与进程管理实战
1. Linux指令从入门到熟练先搞懂它到底是什么1.1 你敲下的每一条指令背后都发生了什么很多刚接触Linux的读者都有类似的体验看着别人噼里啪啦敲出一串命令屏幕瞬间刷出大段输出觉得又帅又高深。等自己上手才发现最痛苦的不是记不住命令而是不知道一条命令为什么这么写、改哪里才能达到目的。我最初学Linux也是从死记硬背开始的后来才慢慢悟出来Linux常用指令其实存在一套统一的逻辑框架只要你理解了这套框架剩下的基本就是在查表和举一反三。先说本质。Linux指令不是“代码”它本质上是你在跟操作系统里的一个解释器对话这个解释器叫Shell。市面上常见的Shell有bash、zsh、sh等你敲一条指令Shell会先按空格把它拆成若干字段第一个字段是要执行的程序名后面跟着的是参数和选项。然后Shell会在系统的PATH路径里去查找这个程序找到后启动一个子进程来执行它并把执行结果打印回终端。理解了这一步很多问题就迎刃而解。比如“为什么我明明装了某个软件敲命令却提示command not found”多半就是Shell没有在PATH变量指定的目录里找到这个可执行文件而不是软件本身没装成功。再比如“为什么同一个命令在A机器上能用在B机器上就用不了”除了版本差异大概率是PATH路径不一样或者对应程序根本没有安装。1.2 命令的万能结构命令 选项 参数Linux命令的通用结构可以概括成一句话命令 选项 参数。选项用来修改命令的执行方式参数则是命令操作的目标对象。举个例子ls -la /etc/passwd这里ls是命令-la是选项拆开看是-l和-a两个选项的合并/etc/passwd是参数。选项通常用-接短选项如-l、--接长选项如--all也有些命令允许两种写法混用。我见过不少初学者在这个地方犯迷糊有些人记不住哪个是选项哪个是参数就直接全都堆上去结果命令执行的行为跟自己预期完全不一样。我个人的习惯是拿到一条不熟悉的命令先拆解它的结构看看每个选项是做什么的再想它会对参数产生什么影响。这个习惯一旦养成后面学习任何新命令都会快得多。另外想快速了解一条命令的全部用法可以敲man 命令名查看手册或者敲命令名 --help看精简版帮助。man输出的信息很全但内容多、英文为主刚开始读起来有点吃力--help更友好绝大多数命令都支持适合日常快速查询。我平时的工作习惯是先--help不够再man再不够就上网搜具体场景的案例。2. 文件与目录操作Linux世界里最基础也最高频的指令2.1 目录切换与状态查看从ls -al开始读懂每一列关于Linux常用指令有一句话被反复提及“一切皆文件”。普通文件是文件目录是文件设备、socket、管道在Linux里也被抽象成文件。所以文件与目录操作不仅是必修课更是每天使用频率最高的部分。先聊几个最基础的指令。pwd用来显示当前所在目录cd用来切换目录ls用来列出目录内容。这三个命令本身很简单但组合起来有非常多细节。重点说ls它最常用的组合是ls -al。很多人刚看到ls -al的输出会愣住因为列出的信息比预想的多得多。我把每列拆开解释一下列含义示例第1列文件类型 权限位-rw-r--r--第2列硬链接数目录则包含子目录数1第3列文件属主root第4列文件属组root第5列文件大小字节1024第6~8列最后修改时间Feb 12 09:30第9列文件名passwd第一列里的10个字符很关键第1个字符表示文件类型-代表普通文件d代表目录l代表软链接c代表字符设备b代表块设备。后面9个字符每3个一组分别是属主、属组、其他用户的读r、写w、执行x权限。这10个字符看熟练了你甚至不用敲stat就能对文件状态有个大概判断。顺便说一句ls还有几个我常用的变体ls -lh以人类可读的方式显示文件大小K、M、G日志文件排错时很实用ls -lt按修改时间排序最新修改的排最上面ls -d */只列出当前目录下的子目录。这些都是高频场景的得力工具。2.2 文件的复制、移动与删除这些坑你一定要避开文件创建用touch空文件或编辑器写入如vim复制用cp移动和重命名用mv删除用rm。这些命令单独学都很简单但组合使用时会出现不少让人挠头的问题。cp最常用的参数是-r递归复制目录、-p保留权限和属性、-a归档模式等价于-dpR。cp -a在备份目录时几乎是标准动作因为它能保留软链接、权限、时间戳不会把备份内容弄歪。我见过不少同事用cp -r备份目录结果备份出来的东西权限全乱套拷回原位置后服务直接起不来这就是没用-a的教训。mv在跨文件系统时会先复制再删除原文件所以如果要移动一个大目录建议用rsync而不是mv因为rsync支持断点续传中断后可以接着传。这个细节在服务器之间搬运数据时特别重要。rm是Linux世界里最需要敬畏的命令之一。最容易出事故的是这条rm -rf /目录路径-r是递归删除目录及其内容-f是强制删除、不提示确认。这两者加起来威力极大。我给自己定了几条规矩第一rm -rf后面跟的路径必须写绝对路径而且是完整手敲的绝对路径不拼写、不补全、不用变量拼凑第二删除前先ls列一下要删的内容确认没有删错目录第三删除重要数据之前先备份或移动到临时目录观察几天再决定是否彻底删除。做到这三条基本能避开大部分rm事故。2.3 查找文件的几种思路find命令的实用组合查找文件的命令有很多find是功能最全面的也是我日常使用频率最高的。它基本格式是find 查找路径 -name 文件名模式 -type f -size 10M -mtime -7这条命令的意思是在指定路径下查找文件名匹配指定模式、类型为普通文件、大小大于10MB、最后修改时间在7天以内的文件。选项可以自由组合用一条find完成多条件筛选比挨个目录去翻高效得多。find有几个参数需要特别注意。-mtime -7表示最近7天内修改过7表示7天以前修改的-size 10M表示大小超过10MB-10M表示小于10MB-name支持通配符比如*.log就能匹配所有以.log结尾的文件。查找目录用-type d查找普通文件用-type f查找软链接用-type l。find还有一个高阶的用法是配合-exec执行操作。比如找出所有.log结尾的日志文件然后打包find /var/log -name *.log -type f -exec tar -czf logs.tar.gz {} 这里的{}会被替换成找到的文件名表示将所有匹配结果一次性传给tar。这条命令在日志归档场景下非常好用不用自己手动去收集文件列表。3. 文本处理与查看排查问题的第一利器3.1 查看日志文件tail、head、less的配合哲学服务器上出了问题第一反应通常是去看日志。日志文件动辄几百MB甚至几个GB不可能用文本编辑器直接打开。这时候就需要掌握查看文本的高效方式。tail是从尾部查看文件内容我在排查问题时用得最多。生产环境常用的是实时跟踪模式tail -f /var/log/nginx/access.log加上-f参数后命令会持续输出新追加的内容让你能实时看到日志的变化。排查线上问题时开一个窗口挂着tail -f然后手动触发一次请求马上就能看到是哪个环节出的问题。这个操作可以说是我排查故障时最频繁使用的指令之一。如果只想看文件最后100行可以写tail -100 /var/log/xxx.log注意-100和tail直接连在一起中间不需要空格。相对地head是从头部查看文件通常加-n指定行数比如head -n 20查看前20行。less更适合浏览大文件它的优势是可上下翻页、支持搜索。进入less界面后可以按/关键词搜索并高亮匹配内容按n跳到下一处匹配、按N跳到上一处匹配按Shiftg跳到文件末尾、g跳到文件开头按q退出。这些都是less的基本交互掌握了之后浏览日志会顺畅很多。需要注意的是很多服务器默认没有安装less如果没有就用more替代但交互体验差一些。3.2 grep文本搜索的核心技能从基础到进阶grep是我个人认为Linux指令里最值得花时间搞透的命令之一。它的基础用法是按行搜索匹配内容并输出grep error /var/log/app.log这个命令在/var/log/app.log中查找包含error的行并显示出来。结合管道符grep可以跟任意命令组合。比如查看进程时只筛选感兴趣的部分ps aux | grep java这条命令排错时非常实用先ps aux查看全部进程再用grep筛选出与java相关的行避免被大量无关输出淹没。grep还有几个高频参数-i忽略大小写日志里ERROR和error混用的情况很常见加上-i能避免漏匹配-n显示匹配行所在的行号定位问题代码更准确-r或-R递归搜索目录在源码目录里查找某个函数定义时几乎必用-v反向匹配输出不包含关键字的行-E启用扩展正则表达式适合写复杂匹配模式。还有一个很顺手的组合grep -C 5在匹配行前后各显示5行上下文排查日志时能直接看到错误前后的关联信息不用再单独去翻文件。正则表达式是grep能力的核心进阶。比如匹配IP地址的写法grep -E [0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}匹配以error开头的行grep ^error匹配以数字结尾的行grep [0-9]$。这些基础的正则规则建议用心记牢因为grep只是正则的一个入口后面学sed、awk、vim时都会用到一次投资终身受益。3.3 管道与重定向把命令串起来解决复杂问题Linux指令之所以能组合出无限能力核心秘密在于管道|和重定向、。管道的作用是把前一个命令的输出作为后一个命令的输入实现命令间的数据传递。重定向则把输出写入文件而不是屏幕。最常见的一个组合是统计日志中的错误数量grep ERROR /var/log/app.log | wc -lwc -l统计行数整个命令的含义是从日志中筛选出ERROR行然后统计这些行有多少。一条命令解决一个统计需求不用写脚本。另一个非常实用的组合是查看当前目录下占用空间最大的文件du -sh * | sort -rh | head -n 10du -sh *显示每个目录或文件的大小sort -rh按大小从大到小排序head -n 10只显示前10个。整个管道串起来一条命令定位磁盘占用大户排查“磁盘满了”问题相当高效。重定向的核心符号有覆盖写入和追加写入。echo hello /tmp/a.txt把hello写入文件并覆盖原内容echo world /tmp/a.txt把world追加到文件末尾。还有一个细节是21它把标准错误输出重定向到标准输出这样错误信息也会被写入同一个文件。比如定时任务脚本里常用/opt/scripts/backup.sh /var/log/backup.log 21这样无论脚本输出正常日志还是报错信息都会完整记录到backup.log里排查定时任务失败原因时就方便了。4. 权限、进程与系统状态从“会用”到“会管”4.1 rwx权限位详解与chmod的两种用法Linux系统的权限模型可以概括为“属主、属组、其他用户”三类对象的“读、写、执行”三种权限。用ls -l查看文件第一列rwxr-xr--这样的组合就描述了完整权限状态。从左到右依次是属主权限、属组权限、其他用户权限。r代表读取数值4w代表写入数值2x代表执行数值1-代表没有对应权限。修改权限用chmod有两种常用写法符号模式和数字模式。符号模式直观易懂chmod ux script.sh # 给属主增加执行权限 chmod g-w config.conf # 去掉属组的写入权限 chmod or readme.txt # 给其他用户增加读权限 chmod ax script.sh # 所有用户都增加执行权限数字模式更简洁用三个数分别表示属主、属组、其他用户的权限值。每种权限对应数值相加比如rwx是7421rw-是642r--是4r-x是541。日常常用的组合包括chmod 755 script.sh属主可读可写可执行属组和其他可读可执行。这是脚本的标准权限。chmod 644 file.txt属主可读可写属组和其他可读。这是普通文件的常见权限。chmod 600 id_rsa仅属主可读可写。这是私钥文件的标准要求权限设置过宽会被SSH拒绝加载。数字模式的效率在日常使用中比符号模式更高但前提是对数值组合足够熟悉。我建议先用符号模式理解权限逻辑再逐步过渡到数字模式两者都会用才算真正掌握权限管理。4.2 进程管理的关键操作ps、top、kill的正确打开方式Linux是一个多任务操作系统所有正在运行的程序在系统里都以进程形式存在。查看进程最常用的命令是ps排查问题时我几乎总是先执行ps aux。这条命令的输出包含大量信息USER显示进程属主PID是进程号%CPU和%MEM是CPU和内存占用百分比STAT是进程状态最后COMMAND是启动进程的命令行。如果只查看某个特定服务是否在运行可以配合grepps aux | grep nginx使用时要留意输出结果里会包含一条grep自身的进程这算是正常现象。判断服务是否在运行重点看有没有对应的主进程在。动态查看系统资源占用有top命令。top以实时刷新的方式展示进程排名默认按CPU占用率排序按P键可以按CPU排序按M键按内存排序按q退出。通常排查性能问题我会先跑一次top看看排在前面的进程是哪个再针对这个进程深挖。简单操作几下就能定位哪个进程在消耗系统资源非常直观。终止进程用kill基本用法是kill PID默认发送SIGTERM信号请求进程正常退出。如果进程不响应再升级为kill -9 PID发送SIGKILL信号强制结束。这里有个重要的细节kill -9是最后手段直接杀死进程会让它没有机会保存数据、清理临时文件可能导致数据损坏或残留锁文件。实际工作中我见过有人一上来就kill -9结果进程被杀掉了数据库事务没有正常回滚重启后需要人工修复麻烦得很。正确的做法是先用默认信号等几秒看进程是否退出不行再用-9。4.3 系统状态与资源查看df、du与systemctl的实用技巧磁盘空间不足是Linux服务器最常见的故障之一。排查时可以先用df -h查看磁盘整体使用情况-h选项以人类可读的方式显示容量。如果某个分区使用率达到100%再用du定位具体是哪个目录占的空间du -sh /var/lib/docker 2/dev/null | sort -rh | headdu -sh分别显示每个目录的总大小2/dev/null把无法访问目录的报错丢弃丢到黑洞设备避免输出被错误刷屏再用管道排序找出最大的目录。一层层追踪下去很快就能找到占用空间的“元凶”。服务管理方面现在主流Linux发行版都在使用systemd体系。相关命令由systemctl统一管理systemctl status nginx # 查看服务状态 systemctl start nginx # 启动服务 systemctl stop nginx # 停止服务 systemctl restart nginx # 重启服务 systemctl enable nginx # 设置开机自启 systemctl disable nginx # 取消开机自启我强烈建议不要直接执行nginx等服务的可执行文件来启动服务因为这样绕过了systemd服务不但不会自动守护开机后也不会自动拉起。排查服务问题时第一件事永远是systemctl status它会直接告诉你服务当前状态、最近日志和常见错误原因比自己去翻日志高效太多。5. 常见问题与排查技巧实录工作中踩过的坑5.1 command not found不只是没安装这么简单我在交接给新人时发现“command not found”是出现频率最高的报错。它通常有三个原因。第一种是命令真的没安装比如机器上没装nettoolsifconfig就找不到。这种情况直接用包管理器安装CentOS系用yum install -y net-toolsUbuntu系用apt install -y net-tools。第二种是可执行文件在但不在PATH环境变量里。比如自己编译安装的软件默认放在/usr/local/xxx/bin下没有加入PATH直接敲命令就会找不到。解决办法是把目录追加到PATHexport PATH$PATH:/usr/local/xxx/bin不过这样只对当前终端会话有效想永久生效需要写入/etc/profile或~/.bashrc。第三种是当前用户没有执行权限最常见的情况是脚本没有加执行权限运行./script.sh时会提示权限不够此时执行chmod x script.sh即可解决。排查这类问题时可以先which 命令名查看命令是否存在以及路径再echo $PATH确认PATH内容两步就能定位问题所在。5.2 rm误删之后的补救与防护思路rm误删是我见过后果最严重也最让人头疼的问题。不巧的是Linux原生环境下删除的文件很难恢复所以防护永远比补救重要。我推荐的防护手段是在~/.bashrc里给rm设置一个别名alias rmrm -i这样执行rm时会先确认是否删除。对重要目录还可以进一步包装成移动而不是直接删除alias rmmv -t ~/.trash --backupt也就是说不真正删除而是挪到回收目录。虽然这会影响使用习惯但对生产环境来说多一重保护总比事故后追悔莫及要好。如果真的发生了误删首先要立刻停止对磁盘的写入操作避免数据块被覆盖。然后尝试extundelete、debugfs等工具恢复但成功率很大程度上取决于文件系统类型、删除时长和写入活动并没有100%的保证。我自己遇到过一次误删配置文件最后是凭着记忆重建完成了配置补齐过程相当痛苦。所以我的建议很朴素重要文件必须定期备份删除前三读三确认能加防护别名就加上。5.3 grep匹配不到的常见原因隐藏字符与编码的坑有一类问题特别容易被忽略日志文本明明有某个关键字但grep就是匹配不到。遇到这种情况先确认关键字拼写是否有误再确认日志文件编码格式是否一致。中文字符如果文件编码是GBK而终端是UTF-8匹配结果会出现偏差此时先执行file 日志文件查看编码再用iconv做编码转换后再查。还有一个很隐蔽的问题是文件里的不可见字符。有些程序写入日志时会带\r回车符Windows风格换行导致每一行最后多了个隐藏的\r。此时即使看起来同样的单词grep也可能匹配不到。解决办法是先用cat -A 文件名查看看不见的字符$符号表示换行位置如果行尾出现^M就说明确实存在\r再用sed -i s/\r$// 文件把它去掉。这类问题排查起来的思路其实是一环套一环确认关键字对不对、确认编码、确认隐藏字符通常很快就能找到根源。我建议新手遇到“明明有却匹配不到”的情况先别急着怀疑自己的语法用上述三步排查法走一遍大部分问题都能解决。写在最后这几年用下来我自己最深的体会是Linux常用指令的学习没有捷径敲得多了自然就熟了。如果你问我哪几条命令最值得花时间搞透我会推荐grep、sed、awk这套文本处理三剑客因为运维和开发中90%的问题排查到最后都在处理文本再加上find和systemctl基本就能覆盖日常工作的主场景。还有一个特别实用的小习惯分享给大家善用Tab键自动补全和上下方向键调取历史命令。很多人还没养成这个习惯一条长命令反复手敲既慢又容易出错。你敲命令时按一下TabShell会自动补全文件名或命令名如果有多个匹配再按两下Tab它会列出可选项。历史命令也很重要临时想不起之前敲过什么命令时直接敲history查看完整记录或者按住CtrlR进入反向搜索模式输入关键字就能定位到历史中匹配的命令。这个小习惯一旦养成效率提升非常明显。最后想说的是别怕敲命令更别怕敲错。Linux本身就是个开放的环境多敲几次、多踩几个坑慢慢你会发现自己从“记不住命令”变成了“遇到问题先想能用什么命令解决”到了这个阶段你就真正入门了。