第一组:在文件系统里移动和查看
先认路。打开 WSL,逐条敲下面的命令,每敲一条都看看输出:
bash
pwd # 我现在在哪个目录(print working directory)
ls # 列出当前目录的内容
ls -l # 详细列表:权限、大小、修改时间
ls -la # 加上隐藏文件(以 . 开头的)
ls -lh # 大小用人类可读单位(K/M/G 而不是字节)
cd / # 跳到根目录
ls # 看看 Linux 的顶层目录结构
cd ~ # 回到你的家目录(~ 是 home 的简写)
cd - # 回到上一个待过的目录
重点理解 :ls -l 输出的第一列像 drwxr-xr-x,开头的 d 表示这是目录(- 表示普通文件),后面九个字符是权限(读 r / 写 w / 执行 x),分给 所有者/组/其他人 三组。这个你现在有个印象就行,后面讲权限再细说。
第二组:创建、移动、删除
bash
mkdir practice # 建一个目录
cd practice
touch a.txt # 建一个空文件
echo "hello infra" > note.txt # 把文字写进文件(> 是覆盖写入)
echo "second line" >> note.txt # >> 是追加写入,不覆盖
cat note.txt # 打印文件全部内容
cp note.txt note2.txt # 复制
mv note2.txt renamed.txt # 移动 / 重命名(同一个命令)
ls -l # 看看现在有哪些文件
rm a.txt # 删除文件
一个必须现在就建立的安全意识 :Linux 的 rm 没有回收站,删了就是真没了。尤其 rm -rf 配合通配符极其危险。现在只用 rm 文件名 删具体文件,不要急着用 rm -rf。
第三组:查看文件内容(几个高频工具)
先造一个多行文件来练:
bash
seq 1 100 > numbers.txt # 生成 1 到 100 每行一个数字,写入文件
cat numbers.txt # 全部打印(文件大时会刷屏)
head numbers.txt # 只看前 10 行
head -n 3 numbers.txt # 只看前 3 行
tail numbers.txt # 只看后 10 行
tail -n 5 numbers.txt # 后 5 行
less numbers.txt # 分页查看(按 空格 翻页,按 q 退出)
wc -l numbers.txt # 数文件有多少行(line count)
tail 还有个杀手锏 tail -f,实时跟踪文件新增内容------后面你看训练日志、容器日志全靠它,先记个名字。
第四组:管道与重定向
核心概念 :管道符 | 把前一个命令的输出,直接喂给后一个命令当输入。这样小工具就能组合成强大的处理链。
先理解输入输出的去向:
bash
echo "hello" > out.txt # > 把输出重定向到文件(覆盖)
echo "world" >> out.txt # >> 追加
cat out.txt | wc -l # cat 的输出通过管道喂给 wc,数行数
cat out.txt | wc -l 这条要细品:cat 把文件内容吐出来,| 把这些内容传给 wc -l,后者数了有几行。cat 自己不数行,wc 自己不读文件,但管道让它们协作。
再用之前的 numbers.txt 练几个组合:
bash
cat numbers.txt | head -n 20 | tail -n 5 # 取前20行里的后5行 = 第16-20行
seq 1 1000 | wc -l # 不落地文件,直接数 seq 生成了多少行
ls -l /etc | wc -l # /etc 目录里有多少个条目
最后一条很实用:你不用先把 ls 结果存文件再数,直接管道接 wc 就行。这种"边产生边处理"的思路贯穿整个命令行。
第五组:grep ------ 按内容查找
grep 是从文本里捞出匹配的行,你以后从几万行日志里找报错全靠它。
bash
seq 1 100 > numbers.txt
grep "5" numbers.txt # 找出所有含 "5" 的行(5,15,25,50,51...)
grep "5" numbers.txt | wc -l # 数一下有多少行含5
grep -c "5" numbers.txt # grep 自带计数,-c 直接给数量
grep -v "5" numbers.txt # -v 反向:输出不含5的行
grep -n "5" numbers.txt # -n 显示行号
再练个更真实的场景------从系统文件里查东西:
bash
grep -i "model" /proc/cpuinfo # -i 忽略大小写,看你的CPU型号
cat /proc/meminfo | grep -i "memtotal" # 管道 + grep 看总内存
grep 配合管道是排查问题的黄金组合。比如以后训练崩了,你会敲类似 cat train.log | grep -i error 一秒定位报错行。
第六组:awk 和 sort ------ 按列处理和排序
很多命令的输出是按列排的(像表格),awk 能精准取出某一列。
bash
ls -l # 先看输出,它是多列的
ls -l | awk '{print $5, $9}' # 取第5列(大小)和第9列(文件名)
awk '{print $5}' 的意思是:对每一行,按空格切成若干字段,打印第 5 个。$0 是整行,$1 是第一列,以此类推。这是你从结构化输出里提数据的利器。
sort 排序,uniq 去重,常和 grep/awk 串在一起:
bash
seq 1 20 | sort # 默认按字符串排序(注意:10会排在2前面)
seq 1 20 | sort -n # -n 按数值排序,这才是1,2,...,10,11
seq 1 20 | sort -rn # -r 倒序
一个经典组合,数每个值出现几次:
bash
echo -e "apple\nbanana\napple\ncherry\nbanana\napple" > fruits.txt
cat fruits.txt | sort | uniq -c # uniq -c 统计每行出现次数(需先sort)
cat fruits.txt | sort | uniq -c | sort -rn # 再按次数倒序 = 出现最多的在最上面
最后这条 sort | uniq -c | sort -rn 是命令行里的经典套路,以后你想统计"日志里哪种错误最多""哪个 IP 访问最频繁",就是这个模式。多敲几遍体会它。
好,这是模块一的收尾------进程管理 + 写第一个真正有用的脚本。学完这组,你就把前面所有零散命令串成了一个能交付的小工具。
第七组:进程管理
核心概念:每个运行的程序都是一个进程,有唯一的 PID(进程号)。你以后排查"训练卡住了""GPU 被谁占着""容器里什么在跑",全靠看进程。
bash
ps aux # 列出所有进程(a=所有用户 u=详细 x=含无终端的)
ps aux | head -n 5 # 太多了,先看前5行理解列的含义
ps aux | grep bash # 用管道+grep 找特定进程
ps aux 的列里你现在要认识的:PID(进程号)、%CPU、%MEM(吃了多少内存)、最后的 COMMAND(具体在跑什么命令)。以后 nvidia-smi 显示 GPU 被占用却不知道是谁,你就用类似思路按 PID 反查。
实时监控 用 top(或更好看的 htop):
bash
top # 实时进程监控,按 q 退出
# 如果没装 htop,先装一个(WSL 里):
sudo apt update && sudo apt install -y htop
htop # 彩色、可交互,按 q 退出
htop 你以后会天天开着看 CPU/内存。先进去按 q 退出就行,熟悉界面即可。
后台运行与终止进程:
bash
sleep 300 & # & 让命令在后台跑(这个假装跑了个300秒的任务)
jobs # 看后台任务
ps aux | grep sleep # 找到它的 PID(看输出第二列的数字)
kill <那个PID> # 把它终止掉(把<那个PID>换成真实数字)
& 后台运行、kill 终止进程,是你以后管理长时间训练任务的基本操作。
第八组:写第一个 shell 脚本
现在把零散命令固化成一个可重复运行的文件。脚本本质就是"把你会敲的命令按顺序写进文件,让机器替你敲"。
先建文件。用 nano(最简单的编辑器):
bash
nano hello.sh
在打开的编辑器里输入下面内容:
bash
#!/bin/bash
# 上面这行叫 shebang,告诉系统用 bash 来执行这个文件
echo "脚本开始运行"
echo "当前时间:$(date)" # $(命令) 会把命令的输出嵌进来
echo "我在这个目录:$(pwd)"
echo "这个目录有 $(ls | wc -l) 个文件"
echo "脚本结束"
按 Ctrl+O 然后回车保存,Ctrl+X 退出。然后:
bash
chmod +x hello.sh # 给文件加上"可执行"权限(还记得第一组讲的 x 吗)
./hello.sh # 运行它(./ 表示运行当前目录下的这个文件)
几个要理解的点 :#!/bin/bash 必须在第一行,告诉系统用什么解释器;$(date) 这种 $(...) 语法会先执行里面的命令、再把结果填进来;chmod +x 不加的话文件没有执行权限,直接跑会被拒绝------这正好印证了第一组讲的权限概念。
第九组:综合实战 ------ 你的 nvidia-smi 监控脚本
这就是阶段一开头预告的练手任务。现在你具备所有零件了,我们把它拼起来。
先确认 WSL 里能跑 nvidia-smi:
bash
nvidia-smi # 能看到你的 5060Ti 就继续;报错就先告诉我
能跑的话,看一个有用的查询方式------只取关键数字而不是一大屏:
bash
nvidia-smi --query-gpu=timestamp,memory.used,memory.total,utilization.gpu --format=csv,noheader
这条直接吐出"时间,已用显存,总显存,GPU利用率",干净得正好能写进日志。现在写监控脚本:
bash
nano gpu_monitor.sh
内容:
bash
#!/bin/bash
# 每隔几秒记录一次 GPU 状态到日志文件
LOGFILE="gpu_usage.log" # 变量:日志文件名
INTERVAL=2 # 变量:间隔秒数
echo "开始监控,日志写入 $LOGFILE,按 Ctrl+C 停止"
while true # 无限循环
do
# 取出 GPU 数据,前面加上当前时间,追加进日志
STATS=$(nvidia-smi --query-gpu=memory.used,memory.total,utilization.gpu --format=csv,noheader)
echo "$(date '+%H:%M:%S'), $STATS" >> "$LOGFILE"
sleep $INTERVAL # 等待指定秒数
done
保存退出后运行:
bash
chmod +x gpu_monitor.sh
./gpu_monitor.sh # 开始跑,会持续写日志
让它跑着,另开一个 WSL 窗口 ,实时看日志在增长------还记得我说过的 tail -f 吗,现在用上了:
bash
tail -f gpu_usage.log # 实时跟踪日志新增,按 Ctrl+C 退出
回到第一个窗口按 Ctrl+C 停止监控。然后用前面学的工具分析你刚记录的数据:
bash
cat gpu_usage.log | wc -l # 一共记了多少条
tail -n 5 gpu_usage.log # 看最后5条
cat gpu_usage.log | awk -F',' '{print $2}' # -F',' 用逗号分列,取第2列(已用显存)
这个脚本把模块一几乎所有东西都用上了 :变量、循环、$(...) 命令替换、重定向 >>、date、sleep、tail -f、awk 分列。它还是个真有用的工具------以后你跑训练或推理时,就靠这类脚本盯着显存有没有爆。
总结
下面是给你的命令速查,把这九组归整成一张能随时回看的表------以后忘了某个命令翻这里就行。

这张表你随时可以回来翻。模块一你真正掌握的不是这些命令的拼写------那些忘了查就行------而是两个更重要的东西:管道的组合思维 (小工具串起来解决大问题),以及带着任务去用、而不是干背的学习方式。这两点会一直跟着你到后面所有模块。