📚前言
📒FDE系列内容总纲:
【大纲】FDE 前沿部署工程师学习系列教程-CSDN博客
🚄前置课程列表:
见文档结尾附录。
🚀阶段2·Day 37:权限、进程与文本三剑客
FDE 学习系列教程 · 第二阶段 · 第 4 周 · Day 2预计时长:3 小时 | 难度:★★★☆☆ | 前置知识:Day 36 文件操作命令
📌一句话目标:看懂
rwx权限并用 chmod/chown 解决 Permission denied,掌握 ps/top/kill 管理进程,用 grep/awk/sed + 管道在日志里精准排查问题。
🧑🤝🧑 开场:三个让新手崩溃的瞬间
在 Linux 里待上半天,你大概率会撞上这三堵墙:
写了个脚本
./backup.sh想运行,系统冷冰冰回你:Permission denied(权限被拒绝)服务卡死了,占着端口不放,你不知道怎么找到它、弄死它
客户说"凌晨系统报过错",甩给你一个500MB 的日志文件,用眼睛翻?翻到天亮
今天就把这三堵墙一起拆了:权限让你知道"谁能动什么",进程管理让你掌控正在运行的程序,文本三剑客(grep/awk/sed)+ 管道让你在日志大海里一针见血。
这三样是 FDE 现场使用频率最高的命令行技能,没有之一。
📖 一、权限:rwx这串符号到底在说啥
先建个文件,然后用ls -l看它的"身份证":
cd ~/fde_lab touch hello.sh ls -l hello.sh你会看到类似这样一行:
-rw-r--r-- 1 fde fde 0 Sep 18 10:00 hello.sh └────┬───┘ └┬┘ └┬┘ │ │ └── 所属组(group) │ └────── 所有者(owner/user) └──────────────── 权限位(10 个字符,今天的主角)把权限位 10 个字符拆开:
位置: 1 2 3 4 5 6 7 8 9 10 ┌─┐ ┌─────┐ ┌─────┐ ┌─────┐ │-│ │ r w -│ │ r - -│ │ r - -│ └┬┘ └──┬──┘ └──┬──┘ └──┬──┘ │ │ │ └─ 其他人(other, o):除了所有者和组成员 │ │ └────────── 所属组(group, g):同组的人 │ └─────────────────── 所有者(user, u):文件的主人 └─ 文件类型:- 普通文件 / d 目录 / l 软链接(快捷方式)三个字母的含义:
字母 | 英文 | 对文件的含义 | 对目录的含义(容易忽略!) |
|---|---|---|---|
| read | 能看文件内容 | 能列出目录里有什么(ls) |
| write | 能改文件内容 | 能在目录里增删文件 |
| execute | 能当程序运行 | 能进入这个目录(cd) |
💡 目录的
x权限特别反直觉:它不是"执行目录",而是"能不能 cd 进去、能不能访问里面的文件"。所以一个目录你想正常使用,通常得同时有r(看里面有啥)和x(进得去)。
数字表示法:r=4, w=2, x=1
这是新手最容易发怵的地方,其实就一道小学加法题。每组权限是三个数字之和:
权限位 换算 数字 rwx → 4+2+1 → 7 读写执行全给 rw- → 4+2+0 → 6 能读能改不能跑 r-x → 4+0+1 → 5 能读能跑不能改 r-- → 4+0+0 → 4 只能看 --- → 0+0+0 → 0 啥也不能 三组数字拼一起(所有者-组-其他人): 755 = rwxr-xr-x 主人全权,其他人能读能跑(脚本/程序标准配置) 644 = rw-r--r-- 主人能读写,其他人只读(普通文件/配置标准配置) 600 = rw------- 只有主人能读写(密钥、.env 等敏感文件) 777 = rwxrwxrwx 谁都能为所欲为(⚠️ 生产环境基本等于裸奔,别用)速记图: r w x 4 2 1 ┌────┬────┬────┐ u │ │ │ │ ← 所有者那组数字 ├────┼────┼────┤ g │ │ │ │ ← 组那组数字 ├────┼────┼────┤ o │ │ │ │ ← 其他人那组数字 └────┴────┴────┘ 7 5 5 这种三位数就是横着每组求和🖥️ 二、chmod / chown:改权限、改主人
chmod:修改权限(两种写法都要会)
# ===== 字母法:给谁 +/− 什么权限(直观,推荐新手用)===== chmod +x hello.sh # 给所有人加执行权限(a+x 的省略写法) chmod u+x hello.sh # 只给所有者加 x chmod g-w hello.sh # 去掉组的 w chmod o-r hello.sh # 去掉其他人的 r chmod u+rwx,g+rx,o+r-x hello.sh # 一次设三组(逗号分隔,不加空格) # ===== 数字法:一步到位(老手最爱,干净利落)===== chmod 755 hello.sh # rwxr-xr-x chmod 644 config.yml # rw-r--r-- chmod 600 .env # rw------- # 验证 ls -l hello.sh # -rwxr-xr-x 1 fde fde ... hello.sh ./hello.sh # 加了 x 就能直接这样运行了字母法符号速查:
谁:u 所有者 / g 组 / o 其他人 / a 所有人(all,默认) 操作:+ 添加 / − 去掉 / = 设成(覆盖) 什么:r / w / x 例子:chmod a-w file 所有人都不许写 chmod u=rwx,go=rx file 主人 rwx,其他人 rxchown:修改所有者(通常要 sudo)
# 格式:chown 用户:组 文件 sudo chown fde:fde hello.sh # 主人改成 fde,组改成 fde sudo chown -R fde:fde myproject/ # -R 递归:整个目录连同里面的文件一起改 sudo chown fde hello.sh # 只改主人,组不动Permission denied 急救手册
以后再看到这行红字,对号入座:
报错场景 | 病因 | 药方 |
|---|---|---|
| 脚本没有 x 权限 |
|
改文件被拒 | 文件不是你的 |
|
| 目录缺 x |
|
装软件/改系统配置被拒 | 需要管理员 | 命令前加 |
SSH 连服务器提示密钥权限太开放 | 密钥文件权限不能给别人看 |
|
⚠️别养成"遇事不决 chmod 777"的恶习。777 意味着任何用户都能改你的脚本/程序,在客户服务器上是安全事故。正确做法是给该给的人精确授权。
📖 三、进程管理:找到它、看清它、干掉它
进程(Process)就是"正在运行的程序实例"。同一个程序可以同时跑多个进程(比如开两个终端窗口就是两个 bash 进程)。
ps:查看进程快照
# 看当前终端相关的进程(信息少) ps # ⭐ 看系统所有进程(aux 是最常用组合,死记) ps aux # 配合 grep 找特定进程(FDE 每日操作) ps aux | grep uvicorn ps aux | grep python ps aux | grep nginxps aux输出各列含义:
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND fde 8421 0.5 1.2 123456 45672 ? Sl 10:00 0:08 uvicorn main:app └┬┘ └┬┘ └─┬─┘ └──┬──┘ │ │ │ └─ 具体命令 │ │ └─ 状态(R运行 S睡眠 Z僵尸) │ └─ ⭐ PID:进程编号,杀进程全靠它 └─ 属于哪个用户💡
ps aux | grep xxx会连 grep 自己也匹配出来(因为 grep 进程的命令行里有 xxx)。想排除干扰加一句:ps aux | grep uvicorn | grep -v grep。
top / htop:实时监控
top # 系统自带,实时刷新 # 进入后: # P 按 CPU 排序 M 按内存排序 # k 输入 PID 杀进程 # q 退出 # 更好用的 htop(彩色、可鼠标点、能滚动) sudo apt install -y htop htoptop 头部信息速看: load average: 0.15, 0.10, 0.08 ← 1/5/15分钟平均负载(持续高于CPU核数=忙) Mem: 8167MB total, 3200MB free ← 内存余量 %Cpu(s): 5.2 us ← CPU 占用kill:终止进程(先礼后兵)
# 先找到 PID ps aux | grep uvicorn # fde 8421 ... uvicorn main:app # ① kill PID:发 SIGTERM 信号,"请你优雅退出" kill 8421 # 程序有机会保存数据、关闭连接后自行结束 # ② kill -9 PID:发 SIGKILL 信号,"立刻枪毙,没得商量" kill -9 8421 # 进程卡死、kill 没反应时才用,可能丢失未保存数据 # ③ 按名字批量杀 killall uvicorn # 杀掉所有叫 uvicorn 的进程 pkill -f uvicorn # -f 匹配完整命令行,更灵活kill 信号等级(先礼后兵原则): kill PID SIGTERM(15) 礼貌劝退:你自己收拾一下退出吧 ↓ 没反应 kill -9 PID SIGKILL(9) 就地正法:内核直接回收,无法拒绝 ⚠️ 跳过清理逻辑,万不得已才用📌 标准操作顺序:
ps aux | grep找 PID → 先kill PID等几秒 → 还在?再kill -9。先确认 PID 再杀,杀错进程(比如把数据库 kill -9 了)后果很严重。
端口被占了怎么办(高频实战)
启动服务时报Address already in use,说明端口被别的进程占了:
# 查 8000 端口被谁占(需要 lsof 或 ss) sudo apt install -y lsof sudo lsof -i :8000 # COMMAND PID USER FD TYPE DEVICE NODE NAME # uvicorn 8421 fde 8u IPv4 ... TCP *:8000 (LISTEN) kill 8421 # 找到 PID,杀掉,端口就释放了 # 或者用 ss(系统通常自带) ss -tlnp | grep 8000lsof是什么?
一个 Linux 工具,用来列出当前系统所有"被打开的文件"。
在 Linux 里"一切皆文件",网络连接、端口、socket 也算"打开的文件"。
所以它既能看文件被谁占用,也能看端口被哪个进程占用——这正是我们需要的。
命令参数说明:
sudo | 以管理员权限执行 |
apt install | 安装软件包 |
-y | 自动回答 yes,无需手动确认 |
lsof | 要安装的软件:ListOpenFiles(列出打开的文件) |
lsof | 列出打开的文件 |
-i | 只看网络相关的(Internet 文件,即网络连接/socket) |
:8000 | 限定端口 8000 |
ss是 Linux 下用来查看网络连接和端口监听状态的现代工具,用来替代老牌的netstat。ss -tlnp是它最常用的组合之一,用来列出当前所有正在监听(LISTEN)的 TCP 端口,并显示占用它们的进程。
| 参数 | 全称 | 含义 |
|---|---|---|
-t | TCP | 只看TCP协议(不显示 UDP) |
-l | Listening | 只看处于监听状态的 socket(即等待别人来连接的端口) |
-n | Numeric | 以数字显示端口和地址,不做域名/服务名解析(如显示:8000而不是:http-alt) |
-p | Process | 显示占用该端口的进程(PID + 进程名) |
连起来:
ss查看 TCP 协议、处于监听状态、用数字显示、并带进程信息。
📖 四、管道与重定向:Linux 命令的"组合拳"
在学三剑客之前,必须先掌握两个连接符,它们是把简单命令组合成强大武器的关键。
管道|:前一个命令的输出,喂给后一个命令
命令 A 的输出 ──│管道│──► 当成命令 B 的输入 ps aux | grep uvicorn └──┬───┘ └────┬────┘ 列出所有进程 从里面筛出含 uvicorn 的行# 读日志 → 筛 ERROR → 数有几条 cat app.log | grep ERROR | wc -l # 列目录 → 按字典序排 → 只看前 10 个 ls /etc | sort | head -10 # 查进程 → 排除 grep 自身 ps aux | grep nginx | grep -v grep💡 管道可以无限接:
A | B | C | D,数据像流水线一样依次流过每个命令。这是 Unix 设计哲学的精髓——每个命令只做好一件事,靠管道组合出无限可能。
重定向>>>2>:把输出送进文件
echo "启动时间:$(date)" > run.log # > 覆盖:文件不存在就建,存在就清空重写 echo "第二行" >> run.log # >> 追加:在文件末尾接着写 cat run.log # 错误重定向(明天部署会高频出现) uvicorn main:app > app.log 2>&1 & # └─┬──┘ └─┬─┘ # │ └─ 2>&1:把错误输出(2)也并到标准输出(1)去的地方 # └─ 标准输出(1)写进 app.log # 效果:正常日志和报错全进同一个文件三个标准"流"的编号,了解一下不亏:
0 stdin 标准输入(键盘) 1 stdout 标准输出(屏幕,正常信息) 2 stderr 标准错误(屏幕,报错信息) /dev/null 黑洞:丢进去的东西直接消失(如 2>/dev/null 屏蔽报错)📖 五、文本三剑客:grep / awk / sed
这三个工具各有所长,一句话定位:
┌────────────────────────────────────────────────────────┐ │ grep = 过滤器(找行):大海捞针,只留匹配的行 │ │ awk = 切割机(取列/计算):按列处理文本、做统计 │ │ sed = 替换机(改文本):批量查找替换、行编辑 │ └────────────────────────────────────────────────────────┘先准备一份练习数据:
cd ~/fde_lab cat > devices.csv << 'EOF' device_name,type,temperature,vibration,owner 注塑机A1,注塑,65,8,李工 注塑机A2,注塑,82,12,王工 注塑机A3,注塑,91,16,赵工 冲压机B1,冲压,75,9,李工 冲压机B2,冲压,88,6,陈工 EOF- 作用:在 Shell 里创建(或覆盖)一个名为
devices.csv的 CSV 文件,并写入1 行表头 + 5 行设备数据。>表示覆盖写入(若文件已存在会被清空重写)。<< 'EOF'是 Shell 的heredoc(内联文档)语法,作用是把一段多行文本作为命令的标准输入。写成cat > file << 'EOF' ... EOF时,就是"把EOF之间的内容原样写进文件"。
剑客一:grep —— 过滤行
# 基本用法:输出包含关键词的行 grep "李工" devices.csv # 注塑机A1,注塑,65,8,李工 # 冲压机B1,冲压,75,9,李工 grep -i "A1" devices.csv # -i 忽略大小写 grep -n "注塑" devices.csv # -n 显示行号 grep -c "李工" devices.csv # -c 只输出匹配行数 → 2 grep -v "李工" devices.csv # -v 反向:输出【不含】关键词的行 grep -r "TODO" ~/fde_lab # -r 递归:搜目录下所有文件 grep -E "李工|王工" devices.csv # -E 正则:匹配李工"或"王工 grep "温度" devices.csv || echo "没找到" # 没匹配到时 grep 返回非0退出码grep 高频参数卡:
参数 | 作用 | 典型场景 |
|---|---|---|
| 忽略大小写 | 搜 error/Error/ERROR |
| 显示行号 | 定位报错在日志第几行 |
| 只数行数 | 统计 ERROR 出现几次 |
| 反向匹配 | 排除 DEBUG 噪音行 |
| 递归搜目录 | 全项目搜某个函数名 |
| 支持扩展正则 |
|
| 连带显示匹配行之后N 行 | 看报错后面的堆栈 |
| 连带显示之前N 行 | 看报错前发生了什么 |
| 只输出匹配的部分 | 从整行里抠出设备编号 |
剑客二:awk —— 按列处理
awk 把每行文本按分隔符切成一列一列(默认用空格切,CSV 用-F','指定逗号),$1 $2 $3表示第 1、2、3 列,$0表示整行,NR是行号/行数。
# 取第 1 列和第 5 列(设备名、负责人) awk -F',' '{print $1, $5}' devices.csv # device_name owner # 注塑机A1 李工 # ... # 条件过滤:第 3 列(温度)> 80 的行,打印设备名和温度 awk -F',' '$3 > 80 {print $1, $3}' devices.csv # 注塑机A2 82 # 注塑机A3 91 # 冲压机B2 88 # 统计:温度总和 / 行数 = 平均值 awk -F',' 'NR>1 {sum+=$3; count++} END {print "平均温度:", sum/count}' devices.csv # 平均温度: 80.2 # NR>1 跳过表头;sum 累加;END{} 在所有行处理完后执行 # 给输出加个好看的格式 awk -F',' 'NR>1 {printf "%-10s 温度:%s度 负责人:%s\n", $1, $3, $5}' devices.csvawk 程序结构: awk -F'分隔符' '条件 {动作}' 文件 │ └─ 对每行干什么(print/累加/...) └─ 满足条件的行才处理(可省略=所有行) 特殊变量: $0 整行 $1~$N 第N列 NR 当前行号(总行数) NF 当前行列数💡 awk 是一门完整的小型编程语言,不用学深。FDE 记住三招即可:
print $N取列、条件 {}过滤、sum+=$N累加统计。复杂的数据分析交给第 3 周学的 pandas,awk 负责在服务器上快速看一眼。
剑客三:sed —— 批量替换
# 替换预览(不加 -i:只在屏幕上显示结果,文件不变) sed 's/注塑/注射成型/g' devices.csv # s = substitute 替换;g = global 一行里全换(不写 g 只换每行第一个) # ⭐ -i:直接修改文件(in-place,真改!重要文件先备份) sed -i 's/冲压/冲压工艺/g' devices.csv grep "冲压工艺" devices.csv # 确认改好了 # 实战:批量改配置文件里的地址 sed -i 's/localhost/192.168.1.50/g' config.yml # 删除包含某关键词的行 sed -i '/不要的内容/d' devices.csv # 只打印第 2 到第 4 行(-n 配合 p) sed -n '2,4p' devices.csv⚠️
sed -i是直接改文件,没有撤销键。操作客户的配置文件前,先cp config.yml config.yml.bak留个后路,或者先不加-i预览一遍效果。
🖥️ 六、综合实战:在日志里排查一次故障
把今天学的全串起来。这是 FDE 接到客户电话后的标准排障动作。
第一步:造一份真实感的日志
cd ~/fde_lab cat > app.log << 'EOF' 2026-09-18 09:00:00 [INFO] 服务启动,监听 8000 端口 2026-09-18 09:01:23 [WARNING] 设备 A2 温度偏高: 82 2026-09-18 09:02:15 [ERROR] 设备 A3 通信超时 2026-09-18 09:03:00 [INFO] 触发自动重试机制 2026-09-18 09:03:05 [ERROR] 设备 A3 通信超时(第2次) 2026-09-18 09:05:00 [INFO] 定时巡检完成 2026-09-18 09:10:00 [ERROR] 数据库连接断开: timeout after 30s 2026-09-18 09:10:02 [INFO] 尝试重新连接数据库 2026-09-18 09:10:05 [INFO] 数据库重连成功 EOF第二步:一套组合拳排查
# ❶ 总览:错误一共有几条? grep -c "ERROR" app.log # 3 # ❷ 看所有错误和警告(排除 INFO 噪音) grep -E "ERROR|WARNING" app.log # ❸ ERROR 都出现在第几行? grep -n "ERROR" app.log # 3:... 5:... 7:... # ❹ 看第 7 行那条数据库错误的上下文(前1行后2行) grep -n -B1 -A2 "数据库连接断开" app.log # ❺ 从错误行里抠出涉及哪些设备 grep "ERROR" app.log | grep -oE "设备 [A-Z][0-9]" # 设备 A3 # 设备 A3 # ❻ 统计每台设备出现几次错误(awk 取设备列 + sort 排序 + uniq 计数) grep "ERROR" app.log | grep -oE "设备 [A-Z][0-9]" | sort | uniq -c # 2 设备 A3 # ❼ 最后看一眼日志结尾,确认系统恢复没有 tail -3 app.log # ❽ 真实场景:服务还在跑,实时盯着有没有新错误 tail -f app.log | grep --line-buffered ERROR # Ctrl+C 退出这套流程的"排障思维"
客户:"系统好像 9 点多出问题了" │ ▼ tail -f / tail -100 ← 先看最新/结尾,知道现在啥状态 │ ▼ grep -c ERROR ← 量化:错误多不多? │ ▼ grep -n ERROR ← 定位:第几行?什么时间? │ ▼ grep -A/-B 上下文 ← 还原:报错前后发生了什么? │ ▼ grep -oE + awk ← 提取:哪些设备/用户受影响? │ ▼ 定位根因 → 处理 → 再 tail -f 观察是否恢复📌 客户说"系统挂了",你 SSH 上去第一反应不是乱敲,而是
tail -f+grep ERROR。这两个命令的熟练度,直接决定客户眼中你"专不专业"。
📝 本课小结
类别 | 知识 | 一句话记住 |
|---|---|---|
权限 |
| 读/写/执行;目录的 x = 能进入 |
权限 |
| 所有者/组/其他人 |
权限 | 数字法 | r=4 w=2 x=1,常用 755/644/600 |
权限 | chmod | 改权限: |
权限 | chown | 改主人: |
进程 | ps aux | 看所有进程,配 grep 找 PID |
进程 | top/htop | 实时看 CPU/内存 |
进程 | kill / kill -9 | 礼貌劝退 / 就地正法 |
端口 | lsof -i:端口 | 查端口被谁占 |
管道 |
| A 的输出喂给 B |
重定向 |
| 覆盖写 / 追加 / 错误并入 |
grep | 过滤行 |
|
awk | 处理列 |
|
sed | 替换 |
|
🧠 核心认知:
权限的本质是"身份 × 动作"——你是谁(u/g/o)决定你能干啥(r/w/x),Permission denied 永远从这两个维度排查。
三剑客靠管道组队才厉害:grep 负责"找到行"、awk 负责"拆出列"、sed 负责"改掉字",
|让它们像流水线一样协作。
📋 课后练习
练习 1:权限实操(约 20 分钟)
新建
secret.txt,用chmod 600设成只有自己能读写,ls -l验证显示-rw-------新建
run.sh(内容就一行echo ok),先用字母法chmod u+x加执行权限并运行;再用数字法改成755运行思考题:为什么
.env文件建议用 600 而脚本用 755?
练习 2:进程猎杀(约 20 分钟)
在一个终端启动
uvicorn main:app --port 8000(在 ~/fde_project 里)新开终端,用
ps aux | grep uvicorn找到它的 PID用
sudo lsof -i :8000确认占用端口的就是它用
kill PID优雅停止,回到第一个终端观察服务退出的输出
练习 3:日志排查综合题(约 30 分钟)
用本课的app.log完成:
数出 INFO、WARNING、ERROR 各有多少条(提示:分别
grep -c)列出所有含时间戳
09:10的日志(系统在那一分钟干了啥?)用 awk 统计:跳过表头不算,写出命令提取所有
[ERROR]后面的错误描述用 sed 把日志里所有
设备 A3替换成设备 DEVICE-A3,先不加-i预览,再-i真改进阶:
awk '/ERROR/{print}' app.log | wc -l和grep -c ERROR app.log结果一样吗?为什么?
🔭 下节预告
单条命令再厉害,也是你敲一下它动一下。明天学Shell 脚本——把一串命令写进文件,加上变量、条件、循环、函数,让它变成一个能判断、能复用的小程序。
收官实战是写一个自动备份脚本:传一个目录进去,自动打包压缩、按日期命名、记录日志、报告大小。以后客户让你"每天备份一下",你就有现成的家伙事儿了。明天见!
🌍附录:前置课程列表
阶段一:认知启蒙(AI 认知与 FDE 角色)
AI 认知
【FDE系列】阶段1Day 1:AI 层级关系 — 四个嵌套的圈-CSDN博客
【FDE系列】阶段1Day 2:AI 三阶段发展史 — 会认 → 会判断 → 会创造-CSDN博客
【FDE系列】阶段1Day 3:符号 AI vs 机器学习 — 两条路线的本质区别-CSDN博客
【FDE系列】阶段1Day 4:Transformer 的历史意义 — 2017 年的分水岭-CSDN博客
【FDE系列】阶段1Day 5:本周复习与自测 — 检验你的 AI 认知地基-CSDN博客
【FDE系列】阶段1Day 6:Transformer 架构 — 一张图纸盖出千千万万栋楼-CSDN博客
【FDE系列】阶段1Day 7:LLM 本质 — 文字接龙机器-CSDN博客
【FDE系列】阶段1Day 8:Token — 模型眼中的最小单位-CSDN博客
【FDE系列】阶段1Day 9:AI 幻觉 — 为什么会一本正经地胡说八道-CSDN博客
【FDE系列】阶段1Day 10:上下文窗口 — 模型的记忆力上限 + 本周复习-CSDN博客
【FDE系列】阶段1Day 11:Prompt — 给模型立规矩-CSDN博客
【FDE系列】阶段1Day 12:Memory — 让模型记住上下文
【FDE系列】阶段1Day 13:RAG — 给模型配图书管理员-CSDN博客
【FDE系列】阶段1Day 14:Tool Use — 让模型动手操作-CSDN博客
【FDE系列】阶段1Day 15:MCP — 统一的工具接口标准 + 第三周复习-CSDN博客
FDE 基础概念
【FDE系列】阶段1Day 16:什么是 FDE — 把 AI 变成客户结果的人-CSDN博客
【FDE系列】阶段1Day 17:FDE vs 传统实施 — 三大本质区别-CSDN博客
【FDE系列】阶段1Day 18:FDE 三重身份 + C6 胜任力模型-CSDN博客
【FDE系列】阶段1Day 19:七阶段行动路径 + 行业经验的价值-CSDN博客
【FDE系列】阶段1Day 20:阶段总结与产出物 — 第一阶段收官-CSDN博客
阶段二:技术地基(Python + FastAPI + SQL + Docker + API 集成)
Python基础
【FDE系列】阶段2:Day 21:Python 环境搭建 — 写出你的第一行代码-CSDN博客
【FDE系列】阶段2:Day 22:变量、数据类型、条件判断 — Python 的“记忆“和“判断“-CSDN博客
【FDE系列】阶段2:Day 23:循环与函数 — 让代码跑 100 遍、把逻辑打包复用-CSDN博客
【FDE系列】阶段2:Day 24:数据结构 — 列表、字典、集合、元组-CSDN博客
【FDE系列】阶段2:Day 25:文件读写与 JSON — 让程序连通外部数据(第一周收官)-CSDN博客
【FDE系列】阶段2:Day 26:模块化编程 — 把代码拆成“抽屉柜“-CSDN博客
【FDE系列】阶段2:Day 27:异常处理与日志 — 让程序“摔不烂、查得到“-CSDN博客
FastAPI入门到进阶
【FDE系列】阶段2:Day 28:FastAPI 入门 — 把你的函数变成 API 服务-CSDN博客
【FDE系列】阶段2:Day 29:FastAPI 进阶 — Pydantic 模型与完整 CRUD 实战-CSDN博客
【FDE系列】阶段2:Day 30:生产代码规范 — 测试、类型注解、配置管理(第二周收官)-CSDN博客
SQL基础
【FDE系列】阶段2:Day 31:SQL 基础 — 增删改查一把梭-CSDN博客
【FDE系列】阶段2:Day 32:多表查询 — JOIN 与聚合-CSDN博客
【FDE系列】阶段2:Day 33:进阶查询 — 窗口函数与 CTE-CSDN博客
【FDE系列】阶段2:Day 34:数据清洗 — 把脏数据捋干净-CSDN博客
【FDE系列】阶段2:Day 35:Python + SQL — 工单接入 MySQL + 本周收官-CSDN博客
【FDE系列】阶段2:Day 36:Linux 入门与文件操作 — 扔掉鼠标的第一天-CSDN博客