🍓 第四章 Linux 系统管理
📄 一句话概括

上一节讲了「命令怎么被机器理解」,这一节把最常用的指令按用途分成九组,做成一张能查的网——不是让你背,而是让你知道「想干这件事,该去找哪个命令」。每一组都给了最常用的三五个,以及新手最容易用错的地方。

📝 本节和前面几节的关系

3-5 已经给过「六组必备命令」的入门版——本节是它的完整版:补上进程、系统信息、文本处理、打包压缩、网络下载这五块,并且把每一组的"血泪点"标出来。 4-1 讲了「命令住哪儿、三条流怎么分」——读本节时请随时回去对照,你会发现每个命令都被那套机制罩着。 权限类命令(chmod/chown/sudo)与安装类命令(apt)本节只列名字,不展开——它们各自有专节:4-3 和 4-5。

一、九组命令总览(先有个地图)

组 用途 代表命令
① 看位置 我在哪、这儿有什么 pwd ls cd tree
② 建删搬 造、删、复制、移动、链接 mkdir touch cp mv rm ln
③ 看内容 读文件、改文件 cat less head tail nano
④ 找 找文件、找文件里的字 find grep
⑤ 文本处理 数、排、去重、比、切 wc sort uniq diff cut
⑥ 打包压缩 装成一包、解开一包 tar zip unzip gzip
⑦ 进程与资源 谁在跑、吃多少、杀掉 ps top free df du kill
⑧ 网络 通不通、下载、看 IP ping curl wget ip ss
⑨ 系统与服务 重启、时间、启停服务 systemctl reboot date history

这张表不用背,用的时候回来查就行。真正要养成的只有一个习惯:想干一件事之前,先想「它属于哪一组」——找对组,命令基本就浮出来了。

二、第①组:看位置(我在哪、这儿有什么)

命令 干什么 常用写法 备注
pwd 打印当前路径 pwd print working directory
ls 列出目录内容 ls -l(详细)、ls -a(含隐藏)、ls -lh(大小带单位)、ls -lt(按时间排) 最该练熟的命令
cd 变换目录 cd /etc、cd ..、cd ~、cd -(回上一个目录) cd - 很多人不知道,极好用
tree 用树形画出目录 tree -L 2(只看两层) 默认没装,sudo apt install tree(4-5 讲)

ls -l 那一行到底写了什么(下一节 4-3 会逐位拆开讲权限,这里先认识轮廓):

-rw-r--r--  1 pi  pi   4096  9月 24 10:30  notes.txt
│└┬┘└┬┘└┬┘  │  │   │     │        │          └ 文件名
│ │  │  └── 其他人权限    │   │     └ 修改时间
│ │  └───── 同组权限      │   └ 大小(字节)
│ └──────── 拥有者权限     └ 所属组
└ 类型(-文件 / d目录 / l链接)
⚠️ 一个常被忽略的事实

ls 默认不显示隐藏文件。Linux 里以 . 开头的文件就是隐藏文件(如 .bashrc、.ssh),要 ls -a 才看得见。 新手常犯的错是「我明明建的这个文件怎么不见了」——先想是不是以 . 开头(touch .test.txt 就会「消失」)。

三、第②组:建、删、搬、复制、链接

命令 干什么 例子 血泪点
mkdir 建目录 mkdir -p a/b/c -p 能一次建多层;不加 -p 且父目录不存在会报错
touch 建空文件/改时间戳 touch note.txt 文件已存在时不会清空内容,只更新时间
cp 复制 cp a.txt b.txt、cp -r dir1 dir2 复制目录必须加 -r,忘加就报错
mv 移动/改名 mv a.txt b.txt(改名)、mv a.txt ~/docs/ 同一个命令既管移动也管改名——因为本质都是「换个名字位置」
rm 删除 rm a.txt、rm -r dir、rm -rf dir 没有回收站!见下面警告框
ln 建链接 ln -s /usr/bin/python3 py3(软链接) -s 一定要加;不加是「硬链接」,新手基本用不到
🚨 `rm` 是本章最危险的一条命令

它没有回收站、删了就没了、也不会问你「确定吗」。 三条保命规矩: 1. 拿不准就把命令头换成 ls——rm *.log 改成 ls *.log,看一眼命中哪些再决定删不删。 2. rm -rf 后面永远不要出现空格可能的歧义:rm -rf / etc 和 rm -rf /etc 是两个完全不同的结果,多一个空格就是灾难。 3. 路径里的 ~ 和 / 分清:rm -r ~/tmp 是家目录下的 tmp,rm -r /tmp 是系统临时目录,别写错。

记住这一条:在 Linux 里,「后悔」这件事要靠删之前那一眼,不能靠删之后。

软链接为什么有用:它像 Windows 的「快捷方式」,删掉链接不影响原文件;常用于给「版本号很长的程序名」起个短名字。

ln -s /usr/bin/python3 ~/py3     # 建一个短名字
~/py3 --version                  # 等于 python3 --version
rm ~/py3                         # 删掉链接,python3 本体毫发无伤

四、第③组:看内容与改内容

命令 干什么 例子 说明
cat 一口气打印整个文件 cat /etc/hostname 只适合看短文件;长文件会刷屏
less 分页翻看 less /var/log/syslog 看长文件正解:空格翻页、/ 搜索、q 退出
head 看开头几行 head -n 20 file 默认前 10 行
tail 看结尾几行 tail -n 20 file、tail -f file -f 实时跟踪日志,排查问题的头号工具
nano 简单编辑器 nano ~/.bashrc Ctrl + O 保存、Ctrl + X 退出(3-5 讲过)
💡 `tail -f` 值得单独记

它在做一件事:把文件末尾「拴」在屏幕上——文件一有新内容就立刻显示。 以后你在树莓派上跑一个长期程序、或者看系统日志,就开一个终端 tail -f 盯着,不用反复敲 cat。退出按 Ctrl + C。

顺带记一个加速版:tail -f 配合 grep 只盯关键行—— tail -f /var/log/syslog | grep -i error

五、第④组:找(找文件 vs 找内容)

这是新手最容易混的一对:

想找什么 用哪个 例子
找文件名本身 find find ~ -name "*.py"
找文件里写了什么字 grep grep -r "192.168" ~/
命令 常用写法 说明
find find 起点 -name "模式" find /home -name "config*"
find + 按大小/时间 find . -size +10M、find . -mtime -7 找大文件、找最近改过的
grep grep 关键词 文件 grep error /var/log/syslog
grep -r 递归搜整个目录 grep -rn "TODO" ~/projects(-n 显示行号)
grep -i 忽略大小写 grep -i error log
grep -v 反向:不要含这个词的行 grep -v "^#" config(去掉注释行)
⚠️ `find` 和 `grep` 最常被搞混的一句话
  • find 的 -name 参数是「文件名的模式」,里面写 * 要加引号:find . -name "*.txt"。
  • grep 的文件参数是「要搜的内容所在文件」,它不管你文件叫什么名字。

一句话:find 找「壳」,grep 找「瓤」。

另外,全系统找东西还有两个「加速版」(如果你以后要频繁搜代码或文件,值得知道):

grep -rn "关键词" ~/          # 最通用,随树莓派自带
# 若装了 ripgrep(rg)则更快:sudo apt install ripgrep

六、第⑤组:文本处理五件套(小而精,组合起来威力大)

命令 干什么 例子 搭配提示
wc 数行/词/字 wc -l file(只数行) 数行最常用:ls -1 \| wc -l 数文件个数
sort 排序 sort names.txt、sort -n(按数字) 默认按字母排,纯数字要用 -n,否则 10 会排在 2 前面
uniq 去掉相邻重复行 sort file \| uniq 必须先 sort!它只去掉「挨在一起」的重复
cut 按列切 cut -d: -f1 /etc/passwd -d 定分隔符,-f 选第几列
diff 比较两个文件差异 diff a.txt b.txt 常用于「改配置前留个备份,改完比比看」

把它们串起来的经典一招(统计 /etc/passwd 里每种登录 Shell 各有多少人):

cut -d: -f7 /etc/passwd | sort | uniq -c | sort -rn

拆开读:切出第 7 列(登录 Shell)→ 排序 → 去重并计数 → 按数量从大到小再排。这就是 Unix 的思考方式:每个命令只做一件小事,用管道串成流水线。(| 管道见 3-5)

七、第⑥组:打包与压缩

先分清两件事(新手最容易糊):

tar 两条腿都能走:

想干什么 命令
打包 + 压缩(最常用) tar -czvf pack.tar.gz 目录名
解开 .tar.gz tar -xzvf pack.tar.gz
只看盒子里有什么(不解开) tar -tzvf pack.tar.gz
💡 `tar` 的四个字母怎么记

create 创建 / Extract 解开 / gzip 压缩 / verbose 显示过程 / file 指定文件名。 所以 -czvf =「创建、压缩、边说边做、指定文件名」,-xzvf =「解开、压缩、边说边做、指定文件名」。 f 永远放最后(因为它后面要跟文件名),这是记法里唯一的硬规矩。

跨平台打交道用 zip(因为 Windows 原生认它):

zip -r pack.zip 目录名      # 打包(-r 递归,别忘了)
unzip pack.zip             # 解开
unzip -l pack.zip          # 只看内容清单

和 3-6 呼应:从 Windows 传一堆文件过来,zip 比 tar.gz 省事——Windows 双击就能解开,不用装额外软件。

八、第⑦组:进程与资源(机器的「体检表」)

命令 看什么 常用写法 说明
ps 某一刻的进程快照 ps aux 全系统所有进程
top 动态实时排行 top 按 q 退出;按 M 按内存排、P 按 CPU 排
free 内存用了多少 free -h -h 才有 G/M 单位,否则是一串数字
df 磁盘剩余空间 df -h 看「还剩多少」
du 目录占用大小 du -sh 目录、du -h --max-depth=1 . 看「谁吃得多」
uptime 开机多久、负载多少 uptime 有没有被重启过、机器忙不忙
kill 结束进程 kill PID、kill -9 PID 先试不加参数的 kill,不行再 -9
⚠️ `df` 和 `du` 别再搞混
  • df = disk free:按分区看还剩多少空间(树莓派上最关心 rootfs 那个)。
  • du = disk usage:按目录看占了多少,用来找出「是谁把卡塞满了」。

两者数字对不上是正常的(删除但被进程占用的文件、系统保留区都会造成差值),别为此怀疑人生。

找「谁把 SD 卡吃满了」的标准动作:

df -h                                  # 1. 先看是不是真的快满了
du -h --max-depth=1 ~ | sort -h       # 2. 家目录下各占多少,从小到大排

kill -9 是「拔电源」级别的手段:程序没机会保存和清理。先试 kill PID(温和请它退出),不行再 -9。

九、第⑧组:网络(通不通、下东西、我是谁)

命令 干什么 例子 说明
ping 测通不通 ping -c 4 192.168.1.1 一定要加 -c,否则会一直 ping 下去(按 Ctrl + C 停)
ip a 看本机 IP ip a 新写法;老教程的 ifconfig 已废弃
ip r 看路由表(默认网关) ip r 老写法 route -n
ss 看端口占用 ss -tuln 新写法;老写法 netstat 已废弃
curl 取网页/测试接口 curl -I https://example.com 只取响应头,测「通不通」最快
wget 下载文件 wget 地址 树莓派自带,适合下大文件
hostname -I 一行拿到自己的 IP hostname -I 比 ip a 输出干净得多
💡 老教程失效清单(本组是重灾区)

ifconfig → ip a、route -n → ip r、netstat → ss。 这三对是「同一个东西的新旧名字」。老命令多数还能装回来,但新系统默认没有——所以照老教程敲会报 command not found,那不是你敲错了。 (这一条在 2-5、3-5 都出现过,这里集中给一次对照。)

十、第⑨组:系统与服务

命令 干什么 例子 说明
systemctl status X 看某服务状态 systemctl status ssh 排查服务问题的第一招
systemctl start/stop/restart X 启停服务 sudo systemctl restart ssh 改完配置要重启服务才生效
systemctl enable/disable X 开机自启开关 sudo systemctl enable ssh enable=随开机起
date 看/设时间 date 时间不对会影响联网与证书(回看 2-4 时区)
hostname 看/(临时)设主机名 hostname 永久改在 raspi-config 里
history 看敲过的命令 history、!!(重跑上一条) 配合 Ctrl + R 搜历史(3-5)
sudo reboot / sudo poweroff 重启 / 关机 — 永远用命令或菜单,别拔电源
⚠️ 老教程里 `service X restart` 已经过时

现在是 systemctl restart X。看到老教程写 service ssh restart,在树莓派新系统上会报错或提示你用 systemctl。 记法:service 是旧世界的门卫,systemctl 是新世界的管理员。

十一、动手 Demo:把九组各用一个命令串成一次巡检

在树莓派上依次跑这九步,每一步都对应一组命令:

# ① 看位置:我在哪、这儿有什么
pwd && ls -lh

# ② 建删搬:造个工作区(注意 -p)
mkdir -p ~/linux_drill/logs && cd ~/linux_drill

# ③ 看内容:造文件并写入几行
printf 'error: disk full\ninfo: started\nERROR: timeout\ninfo: ok\n' > logs/app.log
cat logs/app.log

# ④ 找:在文件里搜(忽略大小写)、再找文件
grep -in error logs/app.log
find ~/linux_drill -name "*.log"

# ⑤ 文本处理:数行 + 排 + 去重计数
wc -l logs/app.log
cut -d: -f1 logs/app.log | sort | uniq -c

# ⑥ 打包压缩:把工作区打包,再看内容,最后解开到别处
cd ~ && tar -czvf drill.tar.gz linux_drill
tar -tzvf drill.tar.gz
mkdir -p ~/drill_restore && tar -xzvf drill.tar.gz -C ~/drill_restore

# ⑦ 进程与资源:体检
free -h
df -h /
du -sh ~/linux_drill
ps aux | head -n 5

# ⑧ 网络:我是谁、通不通
hostname -I
ping -c 2 1.1.1.1

# ⑨ 系统与服务:看一眼 SSH 服务与时间
systemctl status ssh --no-pager | head -n 5
date

看到什么算成功:

步骤 预期看到
③ 四行文字原样打印出来
④ grep 命中 3 行(error、ERROR、ERROR 中的 error——-i 让大小写都算);find 列出 app.log
⑤ wc -l 得 4;cut/… 那一串输出形如 1 error: disk full…看的是「每行第一个词各出现几次」
⑥ tar -tzvf 列出 linux_drill/、linux_drill/logs/、linux_drill/logs/app.log 三条
⑦ free 和 df 都带单位(G/M);du 显示的是 KB 级的小数
⑧ hostname -I 打出你的局域网 IP;ping 有 2 次回包、0% 丢包
⑨ 看到 ssh 服务是 active (running);date 显示当前时间

最后清理(一次性把临时东西删掉):

rm -r ~/linux_drill ~/drill_restore ~/drill.tar.gz
ls ~ | grep -E "linux_drill|drill" || echo "清理干净 ✅"

「读结果」提示:第 ⑤ 步那一长串管道是本节的灵魂——它证明「命令可以串成流水线」这件事不是理论。第 ⑦ 步的 df/du 组合,是你以后发现「卡满了」时的标准动作。

十二、30 秒实验

验证「sort 默认按字母排,所以数字要加 -n」。

printf '10\n2\n1\n30\n' > /tmp/nums.txt
sort /tmp/nums.txt          # 第一遍:不加 -n
sort -n /tmp/nums.txt       # 第二遍:加 -n
rm /tmp/nums.txt

你会看到: - 第一遍输出 1 10 2 30——因为按字符比较,10 的 1 比 2 小,所以 10 排到了 2 前面; - 第二遍输出 1 2 10 30——这才是你要的数字顺序。

这 30 秒你收获的是:命令的默认行为常常和直觉不一样,而 --help 里那些选项正是为这些「不一样」准备的。以后凡是「排序结果看着怪怪的」,先想是不是忘了 -n。

十三、常见误区

自测三问 1. 想「找文件名」和「找文件里的字」,分别用哪两个命令?(**`find` 找文件名(`-name`);`grep` 找文件内容**) 2. `tar -czvf` 和 `tar -xzvf` 分别是干什么?那四个字母什么意思?(**创建压缩包/解开压缩包**;`c`=create、`x`=extract、`z`=gzip 压缩、`v`=显示过程、`f`=指定文件名,**`f` 永远放最后**) 3. 想找出「谁把 SD 卡塞满了」,标准两步是哪两条命令?(**`df -h` 看哪个分区满 → `du -h --max-depth=1 目录 \| sort -h` 找是谁占的**)

相关笔记