简介:这是一份适用于Linux初学者与中级用户的《Linux基础命令大全》PDF手册,覆盖超过200个核心命令,涉及文件系统、权限控制、文本处理三剑客、系统监控、网络配置、软件包管理、Shell高级技巧等模块,既可用于系统学习和日常速查,也能帮助运维人员补齐命令行短板。包内共有1个PDF文件,大小约1.01MB,体积小巧却信息密度高,便于随时打开参考。目前已有325人浏览/学习,内容实用性获得不少读者认可。文档不只是罗列命令,还针对每个命令给出参数解析、实战示例和适用场景,并通过访问日志分析、批量重命名图片、监控高内存进程等组合案例,演示如何将基础命令串联成高效解决方案;同时设有危险命令警示区与命令速查表,兼顾安全提醒与快速检索,可显著提升读者在真实服务器环境中的操作效率。
1. 为什么你需要的不是"大全",而是能记住的 60 个基础命令
Linux 基础命令在 man 手册里能翻出一千多个,绝大多数人反复在用的不过二三十个,其余装完系统就没碰过第二回。市面上流传的"linux常用命令大全"清单动辄一百条起步,但只给名字不给场景:ls 列目录谁都会,可遇到权限报错、解压乱码、进程杀不掉时,清单帮不上任何忙。这里按文件、用户、文本、进程四条主线,把最值得记的 Linux 基础命令拆开讲,每条都落到参数、默认行为和真实坑位。适合刚装好系统的新手,也适合会用 ls 和 cd、但一进文本处理和权限排查就卡壳的人。目标只有一个:独立走完"找文件、看权限、处理文本、查进程"这条链路。
2. 文件与目录:Linux 下 ls、cd、find、解压的默认行为与参数坑
2.1 ls -lah 不只是列文件,更是在读权限模型
ls 是所有人接触的第一个 Linux 基础命令,默认行为却常被低估。不带参数时,它输出的不是"当前目录全部内容",而是排除点开头条目后的排序列表。真正常用的组合是 ls -lah:
ls -lah /etc/nginx/ # 长格式、含隐藏文件、人类可读大小-l长格式输出,包含类型、权限、属主属组、大小、修改时间;-a显示隐藏文件;-h把字节数换算成 K/M/G。长格式第一列十个字符,首字符是文件类型:-普通文件、d目录、l符号链接、c字符设备、b块设备。后面九个字符三位一组,依次是所有者、所属组、其他人的 rwx 权限,权限位缺失显示为-。
比如-rw-r--r--表示普通文件,所有者可读写,属组和其他人只读。碰到 Permission denied,第一件事就是看这一列,判断当前用户属于哪个角色:是文件所有者、在属组里,还是"其他人"。目录权限的语义和平常理解不同——读权限只决定能否列出目录内容,执行权限才决定能否 cd 进去。目录是 644 时,文件清单能看到但进不去,这是新手最困惑的权限现象。
cd 的细节少,但cd -回退到上一个目录、cd不带参数回家目录这两个习惯,能明显减少绝对路径的敲击次数。脚本里引用家目录用$HOME而不是~,后者在部分 su 切换场景下不会按预期展开。桌面环境下多数发行版用 Ctrl+Alt+T 打开终端,嵌套终端用 Ctrl+Shift+T 新建标签页。
2.2 find 才是找文件的正式工具,别用 ls -R 硬翻
目录层级一深,ls -R 的翻找效率骤降。find 的语法是"路径 + 条件 + 动作":
find /opt -name "*.conf" -type f -mtime -7 -size +10k # 按名字/类型/时间/体积过滤这段在 /opt 下找文件名以 .conf 结尾、七天之内修改过、体积大于 10KB 的普通文件。-name区分大小写,忽略大小写用-iname;-type f普通文件、-type d目录、-type l符号链接;-mtime -7表示修改时间在 7 天内,+30表示 30 天以前;-size +10k匹配大于 10KB。
提示:find 的
-name做的是文件名字符串匹配,不是正则。要按正则匹配文件名用-regex,并且它匹配的是完整路径。
跨盘搜索是 find 最常被说慢的场景,整机搜时加-xdev防止进入其他挂载点,同时丢弃权限报错:
sudo find / -xdev -name "sshd_config" 2>/dev/null # 不跨挂载点,忽略 Permission denied不加2>/dev/null,输出会被大量权限报错刷屏;不加-xdev,/proc 和 /sys 这类虚拟目录会被扫进去。找到文件后要批量操作时,少用-exec,多配合 xargs:
find /tmp -name "*.tmp" -type f -print0 | xargs -0 rm -f # 空字符分隔,路径带空格也不会断-print0用空字符分隔结果,xargs -0按同样规则读取,文件名里带空格也不会被拆断。这是处理含空格路径最稳的组合,比 for 循环读 find 输出可靠得多。
2.3 解压乱码、7z 与 tar:压缩格式的处理差异
"linux 解压文件乱码"这类问题基本是从 Windows 转过来的用户必踩的坑。Windows 的 zip 用 GBK 存文件名,Linux 默认 UTF-8,unzip 解出来全是乱码。解决方式是指定代码页:
unzip -O CP936 archive.zip # 用 GBK 代码页解释 zip 内的文件名-O CP936告诉 unzip 用 GBK 代码页解释文件名,解出来就是正常中文。-O不是所有发行版默认编译进 unzip 的,遇到 invalid option 时换 7z 或 unar。解压 7z 格式需要先装 p7zip:
sudo apt install p7zip-full # 安装 7z 命令行工具 7z x archive.7z # x 保留完整路径解压7z 的x按完整路径解压,e全部解到当前目录但丢路径,l列出压缩包内容,a创建压缩包。三种格式的操作对照:
| 操作 | tar.gz | zip | 7z |
|---|---|---|---|
| 创建 | tar czf a.tar.gz dir/ | zip -r a.zip dir/ | 7z a a.7z dir/ |
| 解压 | tar xzf a.tar.gz | unzip a.zip | 7z x a.7z |
| 查看内容 | tar tzf a.tar.gz | unzip -l a.zip | 7z l a.7z |
GNU tar 的xf会自动识别压缩格式,tar xzf里的 z 只是历史习惯,加上无妨,但 f 不能省——f 后面必须是归档文件名。老系统传过来的归档偶尔触发 locale 报错时,用LC_ALL=C tar xf old.tar.gz可以绕过去。
3. 用户、组与权限:从 Linux 新建用户到 chmod 的完整链路
3.1 useradd 与 adduser:新建用户的两种姿势,别混用
"linux新建用户"是搜索量很高的场景。useradd 是低层命令,adduser 是 Perl 脚本封装,一字之差,行为差异很大。Debian/Ubuntu 上推荐 adduser,交互式创建家目录、设置密码、分配基本组,按流程走不会漏:
sudo adduser zhangsan # 交互式创建用户、家目录并设置密码useradd 默认不建家目录、不设密码,适合脚本批量创建:
sudo useradd -m -s /bin/bash lisi # -m 建家目录,-s 指定登录 shell sudo passwd lisi # 单独设置或重置密码忘掉-m的后果是用户登录后落在根目录,多数程序因为写不进 $HOME 直接报错。用户建好后要授权,Debian 系加 sudo 组,RHEL 系加 wheel 组:
sudo usermod -aG sudo zhangsan # -a 表示追加,不会替换现有组列表usermod的-aG必须成对使用:-G指定组,-a表示追加。省掉-a会替换用户当前的组列表,把用户从其他组里踢掉,这是权限事故的高发操作。查用户组用groups zhangsan,查完整信息用id zhangsan,后者输出 uid、gid 和全部附属组,排查权限时信息更全。
3.2 chmod 的三位数字与三个特殊位
chmod 数字权限基于八进制:读 4、写 2、执行 1,加起来得到一个位值。755 即所有者 rwx、属组 r-x、其他人 r-x。这套规则几乎所有教程都讲过,容易被忽略的是文件与目录的语义差异,以及三个特殊位。普通文件:4 是读内容,2 是修改,1 是执行。目录:4 是能列出内容,2 是能增删改名,1 是能进入。给了目录 6 但不给 1,文件能看到但进不去,访问一律 Permission denied。日常稳定的几个模式:
| 场景 | 权限 | 说明 |
|---|---|---|
| 配置文件 | 644 | 所有者可改,其他人只读 |
| 可执行脚本 | 755 | 所有人可执行,仅属主可写 |
| 共享目录 | 2775 | 带 setgid,组内成员可写可执行 |
3.2.1 setuid、setgid 与粘滞位
表里 2775 的 2 是 setgid 位,加在三位权限前作为第四位数字。目录带 setgid 后,新建文件自动继承目录的属组,共享目录不必每次手动 chown。setuid(4)用于可执行文件,比如 /usr/bin/passwd 带 setuid,普通用户才能改自己的密码。粘滞位(1)在 /tmp 上能直接看到,权限串末尾是 t,含义是目录内只能删除自己拥有的文件。"目录明明可写,却删不掉别人的临时文件"就是这个位在起作用。
注意:对目录执行 chmod -R 递归修改前,先确认目录内没有指向外部文件的符号链接,否则权限会顺着链接应用到目标文件上。
3.3 权限排查:stat、find 与属主核对
权限报错第一步永远是查属主,不是查权限。nginx 以 www-data 运行,文件属主是 root,这时权限给多少都没用。用 stat 看完整信息:
stat -c '%U %G %a %n' /srv/www/index.html # 输出属主/属组/八进制权限/文件名%U属主、%G属组、%a八进制权限、%n文件名,一行输出就能判断问题在属主还是权限。批量核对目录下的属主分布,用 find 的-printf配合排序统计:
find /srv/www -maxdepth 2 -printf '%u %g %m\n' | sort | uniq -c # 属主与权限组合计数-maxdepth 2限制扫描深度,-printf自定义输出,sort排序后uniq -c计数。结果里大量 root root 755 而业务用户无法写入时,问题位置一眼可见。
4. 文本处理:Linux 下 grep、sed、awk 与管道组合拳
4.1 grep:参数决定你是"找到"还是"找对"
grep 是 Linux 基础命令里使用频率最高的文本工具。基础用法是"grep 模式 文件",但实际业务里更常用的是带参数的组合。比如查 nginx 错误日志里的 5xx,同时排除健康检查探针:
grep -E 'HTTP/1\.[01]" (50[0-9])' access.log | grep -v 'healthz' # 匹配 5xx 并排除探针-E启用扩展正则,(50[0-9])覆盖 500-509;管道后的grep -v反向过滤,排除包含 healthz 的行。核心参数对照:
| 参数 | 作用 | 典型场景 |
|---|---|---|
| -E | 扩展正则 | 匹配分组、或关系等复杂模式 |
| -i | 忽略大小写 | 日志关键字不确定大小写 |
| -v | 反向匹配 | 排除探针请求和白名单 |
| -c | 只统计行数 | 快速统计错误数量 |
| -l | 只列匹配的文件名 | 多文件定位问题来源 |
| -n | 显示行号 | 定位配置或代码行 |
这组参数单独拎出来都简单,组合起来才是日志排查的日常。递归搜索目录时grep -r会把二进制文件也扫一遍,加--include='*.log'限定类型更稳。
4.2 sed:原地修改前先备份
sed 是流编辑器,最常用的是替换和按行筛选。替换语法是s/旧/新/加动作范围:
sed -i.bak 's/192\.168\.1\.10/192.168.1.20/g' /etc/app/config.ini # 原地替换,生成 .bak 备份-i直接修改文件,.bak会在原位生成 config.ini.bak 备份——不写备份直接-i,改错了没有后悔药。s是替换命令,g表示行内全部替换而非第一个匹配,正则里的点要转义成\.,否则 192x168 也会被匹配。按行号取区间是另一块强项:
sed -n '100,120p' access.log # 只打印第 100 到 120 行,不改文件-n抑制默认输出,100,120p只打印指定区间。调试 sed 时永远先去掉-i跑一遍看输出,确认无误再落盘,这条习惯能避免九成事故。多表达式用-e串联:sed -e 's/a/b/' -e 's/c/d/' file。
4.3 awk:按列处理比 cut 可靠得多
按列提取时新手常用 cut 加-d和-f,但 cut 无法处理分隔符连续出现、无法按条件筛选行,awk 是更通用的答案。awk 默认按空白切分,$1第一列、$NF最后一列、NR当前行号:
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -20 # 统计访问量最高的 IPawk 提取第一列(IP),sort排序后uniq -c去重计数,sort -rn按数字降序,head -20取前二十。按条件过滤也很直观,比如筛状态码为 500 的行:
awk '$NF == 500 {print $1}' /var/log/nginx/access.log # $NF 对 nginx 日志就是状态码$NF是最后一个字段,对 nginx 默认日志就是状态码。字段分隔符用-F指定,awk -F','处理 CSV。$0表示整行,NF是字段数,NR是累计行号,这三个内置变量覆盖绝大多数处理需求。
4.4 sort、uniq、head、tail、wc 的惯用组合
统计类任务在这几个命令间循环。sort 默认按字典序,数字排序要-n,倒序-r,按列-k;uniq 只对相邻行去重,必须先 sort 再 uniq;head -n 20取前 20 行,tail -f实时跟踪文件末尾,是看日志的标配;wc -l统计行数。状态码分布可以这样算:
awk '{print $NF}' access.log | sort | uniq -c | sort -rn # 各状态码出现次数200、304、404、500 谁占大头一眼可见。取日志中间段用tail -n 2000 access.log | head -n 100,取最后 2000 行里的前 100 行,分页场景比 sed 行号更好算。
5. 进程与系统状态:Linux 下 ps、kill、top 的精确用法
5.1 ps aux 与 ps -ef:两种格式,一套信息
ps 是查看进程的入口,aux 和 -ef 两种写法并存。aux 是 BSD 风格(a 所有终端进程、u 显示属主、x 含无终端进程),-ef 是 System V 风格(e 所有进程、f 完整格式)。两者信息等价,差别只在列名:aux 的 %CPU、%MEM 更直观,-ef 带 PPID 能看父子关系。日常排查先定位进程:
ps aux | grep -E '[n]ginx: worker' # [n] 防止 grep 匹配到自身进程ps aux的输出里包含 "nginx: worker" 字样的行被显示,而 grep 自己那行因为命令行是[n]ginx,不会被[n]ginx这个模式匹配到。这是 ps 场景的经典技巧。要理清父子关系,用-ef加--forest:
ps -ef --forest | grep -E 'nginx|PID' # 树形缩进显示父子进程关系STAT 列值得记三个:S 睡眠、R 运行、Z 僵尸。僵尸进程是父进程没回收子进程退出状态造成的,杀僵尸本身没用,要顺 PPID 找父进程,一般杀掉父进程或重启对应服务。
5.2 kill 信号:默认是 TERM,不是 KILL
kill 的默认信号是 TERM(15),请求进程优雅退出,由进程自己清理资源。只有进程不响应时才用 KILL(9),由内核强制终止。滥用kill -9是新手最常见的暴力收尾,MySQL、Redis 这类进程直接 -9,重启后大概率要花很久恢复甚至丢数据:
kill -15 12345 # 优雅退出,让进程自己写回数据和清理资源 kill -9 12345 # 内核强制终止,最后手段按名字杀用 pkill,pkill -f 'python3 app.py'的-f匹配完整命令行。信号清单用kill -l查看,常用的就三个:
| 信号 | 值 | 行为 |
|---|---|---|
| TERM | 15 | 优雅退出,进程可捕获并清理资源 |
| KILL | 9 | 内核强制终止,进程无法拦截 |
| HUP | 1 | 重载配置,nginx -s reload 本质是发 HUP |
注意:kill -9 没有给进程任何写回缓存的机会。数据库、队列这类有持久化状态的进程,先 TERM 等超时,再升级到 KILL。
HUP 是守护进程重载配置的惯例信号,很多服务支持kill -HUP <pid>完成 reload,不中断线上连接。
5.3 top 和系统负载:看懂不等于会用
top 打开后按 P 按 CPU 排序、按 M 按内存排序、按 k 输入 PID 杀进程,三个交互键覆盖 90% 场景。硬盘是瓶颈时看 wa 列,内存不足看 si/so 换页。需要脚本采集时用批处理模式:
top -b -n 1 | head -20 # 非交互输出一帧快照,便于抓取和落盘load average 的三个数字分别是 1、5、15 分钟均值。单核机器负载超过 1 说明排满,四核机器 4 才算满。判断负载高不高必须除以核数(nproc),否则四核机器上负载 3 会被误判成过载。磁盘和内存各有一行命令值得固定下来:df -h看磁盘,df -i看 inode——inode 耗尽时df -h还有空间但写不进任何文件;free -h看内存,看第二行的 available 而不是 free,那才是真正可用的量。
6. 让命令长在身上:alias、history 与一条最小排错路径
6.1 用 alias 把高频操作缩短一半
alias 是把 Linux 基础命令改造成个人习惯的最轻量手段。vim ~/.bashrc 追加:
alias ll='ls -lah' # 长格式、含隐藏文件 alias grep='grep --color=auto' # 搜索结果关键字高亮 alias ..='cd ..' # 返回上级目录grep 强制上色后,日志关键字在满屏输出里一眼可见。改完source ~/.bashrc生效。alias 只在交互式 shell 里有效,脚本内不继承,所以脚本里永远写完整命令,别指望别人机器上有你的 alias。对交互体验要求更高的用户,常见做法是换 zsh 配 oh-my-zsh,但先把手上的 bash 别名用熟更实际。
6.2 history 与 Ctrl+R 召回旧命令
history 列出历史,!!重跑上一条,!$取上一条的最后一个参数,实际用到最多的还是 Ctrl+R 反向搜索——输入几个字符就能召回几个月前的完整命令。默认 HISTSIZE 只有 1000,在 .bashrc 里设HISTSIZE=10000并加HISTCONTROL=ignoredups,连续重复的命令只记一条,历史记录的利用率反而更高。
6.3 一条最小排错路径
命令报错按固定顺序排查:先读 stderr 最后一行,这是最接近真相的提示;再echo $?看退出码,0 成功,非 0 各有含义;然后man <命令>或<命令> --help查当前版本参数;最后才把完整报错文本复制去搜。"command not found" 和 "Permission denied" 的分野尤其重要:前者echo $PATH查搜索路径,后者用 stat 看属主和权限位,目录缺 x 位是最常见的 Permission denied 来源。把这两类报错的定位动作练成条件反射,日常排障就已经超过多数人了。
本文还有配套的精品资源,点击获取