第一次打开 cmdchallenge 这个网站的时候,我其实挺不以为然的——不就是按顺序敲几条命令嘛,能有多难?结果第一页还没过半,我就老老实实坐直了。它不会告诉你"用哪个命令",只给你一个目标描述和一堆文件,你得自己组合命令去达成条件,跟真实工作里对着日志猜半天、查了半天才发现是一条管道没写对,完全是同一个路子。
cmdchallenge 本质是一个在线的命令行闯关平台,题量不算大,但覆盖了文件操作、文本处理、系统管理这些日常高频场景。每个题目都有一个明确的预期输出,你写完命令提交后会比对结果,通过才能进入下一题。适合谁?刚学 Linux、想系统补一补 shell 基本功的新手,也适合写过不少脚本但总是"能用就行"、想看看自己有没有漏掉关键参数的老手。这篇文章我不打算只贴答案,而是把每一道经典题背后的命令逻辑、参数选择、踩坑点都拆开讲一遍,最后再回到 Windows CMD 的实用场景,把两边真正用得上的命令串起来。
1. cmdchallenge 是什么,为什么值得认真刷一遍
1.1 平台形式与题目组织
cmdchallenge 的页面非常朴素,一个终端模拟框,一个题目说明,一个提交按钮。题目的描述通常是一句简洁的英文,比如 "print hello world"、"list all files in the current directory"、"print the second line of a file"。它不会告诉你用哪个命令,你得自己判断。
平台会随机生成一组包含若干文件的目录,你的命令就在这个目录里执行。提交后它会比对标准输出,完全一致才判通过。这个机制很关键:它逼着你关注命令的精确输出,而不仅仅是"大概做对了"。比如让你列出文件,你用了 ls 可能输出没问题,但如果你用了 ls -l,多出来的权限、大小、时间列就会导致比对失败。这种"结果说话"的判定方式,比很多人自己在终端里随便敲两下、眼睛看着差不多就完事,要严格得多,也更能暴露细节漏洞。
题目从易到难大致可以分几个层级:
- 最简单的就是
echo、pwd、ls这类单命令操作。 - 中间层是文本处理,
grep、sed、awk、sort、uniq、wc的组合使用。 - 再往上会涉及文件查找、权限修改、进程管理、环境变量。
我刷下来的感受是:前三分之一是热身,中间三分之一开始真正考验你对命令参数的熟悉程度,最后三分之一则需要你具备"把多个命令串成一条管道"的思维。平台还提供了"查看其他解法"的入口,做完一道题后可以看看别人是怎么写的,这一步对我的帮助比刷题本身更大,很多精简到极致的写法就是在那里学到的。
1.2 刷题对实际工作的迁移价值
有人可能会说,这不过是个玩具级的小网站,跟真实项目差远了。但我的体会正好相反。日常写脚本、排查问题的时候,卡住你的往往不是某个冷门命令不会,而是基础命令之间的组合没想清楚。
举个例子。有一次我需要在线上服务器排查日志,要求是"找出最近一小时内访问量最高的前十个 IP"。第一次遇到这种需求的人可能会写一个几十行的 Python 脚本,但如果 shell 功底扎实,一条命令就搞定了:
bash复制grep "2025-06-01 10:" app.log | awk '{print $1}' | sort | uniq -c | sort -rn | head -10
这条命令里的每一个环节,grep 过滤、awk 取列、sort 排序、uniq -c 统计、sort -rn 按数字逆序、head 取前几条,全都是 cmdchallenge 中间层会练到的东西。刷过题之后,你在真实场景里看到类似需求,脑子里会直接浮现出管道结构,而不是先去想"要不要写个脚本"。
另外一个迁移价值在于,它会强迫你读命令的文档。平台不会告诉你每个参数是什么意思,你只有自己去 man、去 --help、去网上搜。这个过程本身就是最重要的能力训练。很多人学了几年 Linux,翻来覆去只会 cd、ls、cat,因为日常工作用不到更复杂的命令,而 cmdchallenge 相当于给你制造了一批"必须用上"的场景,倒逼你把知识面撑开。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 基础关卡:高频命令的细节考验
2.1 Hello World 与 echo 的引号哲学
第一题基本就是让你输出一段固定文本,最简单的解法就是 echo "hello world"。但如果你以为这就完了,那就错过了这个环节最值得琢磨的东西:引号的语义差异。
在 shell 里,双引号和单引号有本质区别。双引号内部的变量、命令替换、特殊字符大部分会被解析,而单引号内部所有内容都会原样输出。看两组例子:
bash复制echo "PATH is $PATH"
# PATH is /usr/local/bin:/usr/bin:/bin
echo 'PATH is $PATH'
# PATH is $PATH
在 cmdchallenge 的题目里,如果目标输出恰好包含 $ 符号,你用双引号还是单引号,结果完全不一样。这题我见过不少人在评论区卡住,其实不是不会 echo,而是没搞懂引号的展开规则。
再延伸一点,echo 在不同环境下行为也有差异。Linux 下的 bash 里 echo 自带换行,但如果你想输出多行文本,可以用 $'...' 这种 ANSI-C 引号,或者直接用 printf:
bash复制echo $'line1\nline2'
# 或者
printf "line1\nline2\n"
printf 的可控性比 echo 强很多,它不会自动加换行,所有格式全靠你自己写 \n。这在处理一些对输出格式有严格要求的场景(比如生成配置文件、拼接请求参数)时特别有用,也是 cmdchallenge 后面某些题目的隐藏考点。
2.2 目录切换与文件列表:cd、ls 的隐藏参数
cd 和 ls 是出现频率最高的两道基础题,但恰恰是这些命令,最能看出一个人是系统学过还是野路子出身。
cd 有几个容易被忽略的用法:
cd -:回到上一个目录。这个在深层次目录切换时非常实用,不用重新敲一长串路径。cd ~:回到当前用户的家目录。cd /:回到根目录,注意是根目录,不是家目录。
ls 才是重头戏。一个常见的 cmdchallenge 题目是列出当前目录所有文件,包括隐藏文件。很多人反应是 ls -la,这没问题,但如果题目描述是 "list all files including hidden ones",你要注意它可能对输出格式有要求。
ls -la 和 ls -a 的输出差了好几列权限、属主、大小、时间信息。如果你只是把文件名列出来就能满足题目,那 ls -a 就够了;如果题目要求的是 "long format",那才需要 -l。做题的时候先看清要求,不要一上来就堆参数。
另外,ls 的通配符也值得掌握:
bash复制ls *.txt # 列出所有 txt 文件
ls file[0-9] # 列出 file0 到 file9
ls file[!0-9] # 列出文件名中对应位置不是数字的
通配符不是 ls 特有的,它由 shell 本身负责展开,所以你可以在任何命令里用。这一点在后面的 file 查找类题目里会反复用到。
3. 文本处理关卡:把数据洗成想要的样子
3.1 先理清需求,再组合管道
cmdchallenge 进入中段之后,题目开始变成"输出某文件的第二行"、"统计某文件里某个单词出现的次数"、"把文件里所有 foo 替换成 bar"这类。这些题目看起来不难,但组合管道的时候,顺序错了就全错。
我总结出一个比较稳的做题思路:
- 先用
cat、head、tail或less看一下原始数据长什么样。 - 明确目标输出是什么:是某一行、某一列、去重后的列表、还是统计后的数字?
- 逆着目标拆解:要得到这个结果,最后一步应该是什么命令?倒数第二步呢?
- 把命令串成管道,先小范围测试,再提交。
比如"输出一个文件里出现次数最多的那个词"这道题,标准思路是:
bash复制cat words.txt | tr -s ' ' '\n' | sort | uniq -c | sort -rn | head -1
这里每一步都不能少。tr -s ' ' '\n' 把空格压缩成换行,让每个单词独占一行;sort 让相同单词相邻;uniq -c 统计每个单词出现次数;sort -rn 按次数降序;head -1 取第一名。如果你上来就先 uniq 再 sort,统计结果就全错了,因为 uniq 只合并相邻的重复行。
3.2 文本过滤与统计:grep、wc 的实战用法
grep 是文本处理里最常用的命令之一,但很多人只知道 grep "keyword",其实它的参数才是关键:
grep -c:统计匹配行数,而不是把匹配内容输出。省得你再接一个wc -l。grep -v:反向匹配,输出不含关键字的行。比如查看日志时排除 DEBUG 级别。grep -i:忽略大小写。grep -r:递归搜索目录下的所有文件。grep -E:启用扩展正则表达式,支持|、+、?这些符号。grep -A 2 -B 2:同时输出匹配行的后两行和前两行,排查日志上下文时极其好用。
wc 本身很简单,就是 word count,但 -l(行数)、-w(单词数)、-c(字节数)这三个参数要分清楚。有个 cmdchallenge 的经典坑题:让你输出一个文件包含的行数,你如果用了 wc -c,拿到的就是字节数,跟行数天差地远。先想清楚题目要的是哪种统计,再选参数。
3.3 流式编辑与列处理:sed、awk 的分工
sed 和 awk 是 shell 文本处理的两大金刚,但定位完全不同。sed 擅长按行做替换、删除、插入,awk 擅长按列做统计、格式化、条件判断。
sed 最常用的就是替换:
bash复制sed 's/foo/bar/' file # 只替换每行第一个匹配
sed 's/foo/bar/g' file # 替换每行所有匹配
sed 's/foo/bar/2' file # 替换每行第二个匹配
sed -i 's/foo/bar/g' file # 直接修改文件
sed -n '2p' file # 只输出第二行
我看到很多新手在 sed -i 上吃过亏。它直接修改文件,没有备份,如果替换规则写错了,文件内容就被破坏了。稳妥的做法是先用不带 -i 的命令跑一遍看输出,确认无误后再加 -i,或者写成 sed -i.bak 's/foo/bar/g' file,这样会生成一个 file.bak 备份。
awk 的默认动作是按空白分隔取列:
bash复制awk '{print $1}' file # 取第一列
awk -F ',' '{print $2}' file # 按逗号分隔取第二列
awk '{sum += $1} END {print sum}' file # 对第一列求和
awk 'NR >= 2 && NR <= 5' file # 输出第 2 到 5 行
awk '{print NF}' file # 输出每行的列数
awk 里的 $0 代表整行,$1、$2 代表第一列、第二列。-F 可以指定分隔符,处理 CSV 或者按冒号分隔的 /etc/passwd 文件时非常关键。cmdchallenge 里有一类题目是"按分隔符取出特定字段",这类题 awk 是标准解法,cut 也能做,但 awk 的优势是可以顺带做条件过滤和数值处理。
3.4 排序、去重与管道思维
sort 和 uniq 看起来太简单了,但组合起来能解决一大批实际问题。
sort 的关键参数:
-n:按数字大小排序,而不是按字典序。这是最常被忽略的一个,直接sort的话 "10" 会排在 "2" 前面。-r:逆序。-k 2:按第二列排序。-t:指定分隔符,通常和-k一起用。
uniq 有一个反直觉的特性:它只去重相邻的重复行。这意味着你几乎总是需要先 sort 再 uniq,除非你明确知道数据已经排好序了。
bash复制sort file | uniq # 去重
sort file | uniq -c # 统计每项出现次数
sort file | uniq -d # 只显示重复行
sort file | uniq -u # 只显示不重复的行
在做日志分析时,sort | uniq -c | sort -rn 这个三段式管道几乎成了固定套路,我前面提到的"统计访问量最高的 IP"就是典型应用。
4. 文件与系统关卡:权限、进程、查找一网打尽
4.1 find 与通配符:按条件定位文件
cmdchallenge 到后面会出现一类题目:给你一个嵌套了很多层的目录,里面混杂着各种类型和权限的文件,让你按某个条件把它们找出来。
find 是这类题目的标准解法。它的基本结构是 find [路径] [表达式]:
bash复制find . -name "*.txt" # 按文件名查找
find . -type f # 只找普通文件
find . -type d # 只找目录
find . -size +10M # 找大于 10MB 的文件
find . -mtime -7 # 找最近 7 天内修改过的文件
find . -perm 755 # 找权限为 755 的文件
实际工作中,find 最常见的两个扩展用法是配合 -exec 和 xargs 做批量操作:
bash复制find . -name "*.tmp" -exec rm {} \;
find . -name "*.log" | xargs head -1
-exec 的写法稍微有点绕,{} 是占位符,\; 表示命令结束。如果你不熟悉这个语法,也可以用 xargs,它的作用是"把前一个命令的输出作为后一个命令的参数"。注意 xargs 默认按空白和换行切分输入,如果文件名里带空格会出问题,用 -0 配合 find -print0 可以解决。
4.2 权限调整与运行中的进程管理
权限类题目在 cmdchallenge 里通常是"给某个文件添加可执行权限"或"修改为指定权限值"。这里牵涉到 Linux 权限模型的核心:三组身份(owner、group、others)和三种权限(read、write、execute)。
chmod 有两种表达方式:
- 符号模式:
chmod u+x file、chmod g-w file、chmod o=r file。 - 数字模式:
chmod 755 file。这个数字是三个权限值的累加,读是 4,写是 2,执行是 1。
我建议数字模式一定要滚瓜烂熟,因为你在看文档、写脚本的时候,到处都会遇到 644、755、600 这样的值。644 是文件默认权限(所有者读写,其他人只读),755 是可执行文件的标准权限(所有者全部权限,其他人读和执行),600 是私密文件(只有所有者能读写)。
进程管理也是常见考点。查看进程用 ps,关掉进程用 kill:
bash复制ps aux # 查看所有进程,带 cpu、内存、命令
ps -ef # 另一种输出风格
kill <PID> # 温和地请求进程退出
kill -9 <PID> # 强制杀死,不留给进程清理机会
kill -9 是最后手段,因为它不会给进程执行清理逻辑的机会,可能导致数据损坏或者资源残留。优先用默认的 SIGTERM(即 kill <PID>),不行了再考虑 -9。
4.3 环境变量与启动脚本
环境变量这块,cmdchallenge 通常会考你如何临时设置、永久设置、或者让某个变量在子进程里生效。
核心概念就两个:export 和 PATH。
bash复制export MY_NAME="zhang" # 设置环境变量
echo $MY_NAME # 读取,注意变量名前要加 $
export PATH=$PATH:/my/custom/bin # 往 PATH 里追加新路径
临时变量和不导出的区别很关键。直接 A=1 只会让这个变量存在于当前 shell,如果它后面跟着一条命令(如 A=1 python3 script.py),变量会传递给这条命令,但不会留在当前 shell 里。加上 export 之后,子 shell 和子进程才能继承。
在真实项目里,环境变量最常见的坑是:服务一重启就"该变量没生效了"。因为你在终端里 export 的变量只对当前终端窗口有效,关掉就没了。要永久生效,得写进启动脚本,常见的几个:
~/.bashrc:每次打开新终端时加载,放别名、自定义函数和临时变量。~/.bash_profile或~/.profile:登录时加载,通常放PATH的配置。/etc/profile:全用户生效的系统级配置,改这个要谨慎。
5. 把 cmdchallenge 的经验带回 Windows:CMD 实用操作
5.1 常用 Windows CMD 命令速查
刷完 Linux 的题,很多人会不自觉地也想把 Windows 的命令行捋一遍。毕竟日常办公电脑大概率是 Windows,很多运维、开发操作还是逃不开 CMD。而且 CMD 的底层原理、命令风格和 Linux shell 差异挺大,但逻辑是相通的——都是"输入命令、解析参数、操作文件和进程"。
我整理了几个最常被搜、也最实用的 CMD 命令组合:
| 场景 | 命令 | 说明 |
|---|---|---|
| 查看当前目录 | cd 或 chdir |
不加参数直接显示当前路径 |
| 切换盘符 | cd /d D:\work |
不加 /d 无法跨盘符切换,这是新手最常踩的坑 |
| 列出文件 | dir |
相当于 Linux 的 ls,dir /a 可显示隐藏文件 |
| 新建目录 | mkdir test |
也支持 mkdir a\b\c 一次建多层 |
| 结束进程 | taskkill /F /IM name.exe |
/F 强制结束,/IM 按镜像名匹配,也可用 /PID |
| 删除文件 | del file.txt |
删除文件夹用 rmdir /s /q folder |
| 查看网络状态 | ipconfig |
查看 IP 配置,类似于 ifconfig |
| 测试网络连通性 | ping -t 目标IP |
Windows 下默认 ping 4 次,加 -t 持续 ping |
cmd 和 powershell 的区别经常有人问。CMD 是传统 Windows 命令行,语法偏简单,适合做快捷操作和旧脚本维护。PowerShell 则是构建在 .NET 之上的现代化 shell,能直接操作对象、写复杂逻辑,相当于把脚本语言和命令行合二为一。如果你在写自动化脚本,建议优先 PowerShell;如果只是快速改个配置、清理个临时文件,CMD 完全够用,而且启动更快、命令更直觉。
5.2 管理员模式下的清理与优化
CMD 里很多操作是要求管理员权限的。最常见的操作是:在开始菜单里找到"命令提示符",右键选择"以管理员身份运行"。窗口标题栏显示"管理员"字样,说明你已经有权限执行系统级命令了。如果你不想动鼠标,还有一个比较快的打开方式:Win + R 直接输入 cmd,然后按 Ctrl + Shift + Enter,同样能唤起管理员 CMD。我观察到不少人说 Win + R 打不开 cmd,这种情况要么是快捷键被输入法或安全软件拦截了,要么是系统策略限制了命令执行,可以先试 Win + X 再选"终端"或"命令提示符"绕过去。
系统变卡、C 盘空间告急的时候,几条 CMD 命令能帮上大忙:
bat复制rem 清理 Windows 临时文件
del /q /f /s %TEMP%\*
del /q /f /s C:\Windows\Temp\*
rem 打开磁盘清理工具
cleanmgr
rem 关闭休眠文件,立刻释放约 6GB 左右空间
powercfg /hibernate off
powercfg /hibernate off 是我特别想提醒的一条。现代 Windows 默认开启快速启动,但代价是系统盘里会有一个几 GB 的休眠文件 hiberfil.sys。如果你平时不依赖休眠功能,关掉它是最省事的"清理 C 盘垃圾"方案,一条命令立刻见效。要注意的是,关闭休眠后快速启动也会失效,开机速度可能略有变化,但这个代价对绝大多数人来说完全可接受。
开机启动项也是高频需求。在运行框里输入 shell:startup 可以打开当前用户的启动文件夹,把快捷方式放进去就是开机自启;输入 msconfig 打开系统配置,可以开关所有用户级的启动项和服务;更细粒度的管理可以用 taskmgr 打开任务管理器,切到"启动"标签页直接右键禁用。用命令行来管理的话,可以用 PowerShell 的 Get-CimInstance Win32_StartupCommand 列出全部启动项,但日常操作其实 msconfig 和任务管理器就够了。
6. 常见问题与排查技巧实录
6.1 卡题时的三种排查思路
刷 cmdchallenge 刷到一半卡住是常态,卡题本身不可怕,可怕的是没有一套系统排查思路,只能瞎试。我复盘了多次卡题经历,总结出三条最有效的排查路线。
第一,先复现原始数据。把题目目录里的文件打开看一眼,确认数据长什么样,有没有空格、空行、特殊符号。很多题做不出来,是因为你假设数据是干净的,而实际文件里可能有一堆换行和多余空格。用 cat -A 可以看到行尾符和 tab 符,用 od -c 可以看原始字节,这两招排查隐形字符非常管用。
第二,把问题拆成多个单步命令验证。比如你想做"统计每个 IP 出现的次数",不要直接一条管道提交,先 awk '{print $1}' 看看第一列是不是 IP,再 sort | uniq -c 看看统计结果长什么样。每一步的输出都确认无误后,再把管道串起来。很多人卡题是因为一步错了,后面全跟着错,但自己又不知道错在哪一步。
第三,动手查文档而不是猜参数。sed、awk、grep 这些命令的参数太多,记不住很正常。用 man 查手册,或者用 help 看内建命令说明,网上搜也行,但一定要查确认之后再跑,不要拿生产环境当试验场。cmdchallenge 的优势是环境是沙箱,随便跑不会出事,但坏习惯一旦养成,在真实服务器上就要付出代价。
6.2 权限、路径、引号三类高频报错
我在帮朋友排查时发现,命令行报错翻来覆去就那几类,把它们彻底搞懂,能解决 90% 的问题。
权限错误,表现通常是 Permission denied。这个很直接,当前用户对目标文件或目录没有对应权限。解决办法是检查文件属主和权限位,用 ls -l 看,必要时用 chmod、chown 调整,或者切换到有权限的用户执行。Windows 下对应的是"请以管理员身份重新运行",原理是一样的。
路径错误,表现是 No such file or directory 或者命令找不到。这个一般有两个原因:一是路径写错了,/ 和 ~ 的含义没搞清楚,或者文件名里的大小写没对上;二是 PATH 环境变量里没包含命令所在的目录,导致 shell 找不到可执行文件。排查时先用 which 命令名 或 where 命令名 看命令实际位置,再检查当前目录是否正确。
引号错误,表现是命令执行后输出和你预期的不一样,但没有报错。这个最阴,因为系统不认为它错了,只是结果不对。比如 Windows 的 CMD 里:
bat复制echo "hello world"
它会连双引号一起输出,跟 Linux 的 echo "hello world" 输出不带引号完全不同。CMD 对引号的处理规则和 bash 不一样,在 CMD 里单双引号都不做变量展开和特殊字符解析。所以你在 Windows 下写命令,要时刻提醒自己"这是在 CMD 里,不是 Linux shell",很多跨平台脚本的隐蔽 bug 就是这么来的。
最后一个建议:把刷题变成肌肉记忆
刷完 cmdchallenge 所有题目之后,我最大的感受是:命令行这东西,光看文档和教程是永远学不扎实的,必须靠大量的手部记忆和试错。就像学游泳一样,你看再多教学视频,不下水就永远不知道换气时头该往哪个角度偏。cmdchallenge 给了你一个安全的池子,池子本身不大,但每一个动作都是实际工作里真正会用到的。
我个人在刷完之后,又给自己定了一个小规则:凡是能用组合命令行解决的日常操作,就尽量不打开图形界面。比如整理下载目录、批量重命名文件、统计日志里的错误数,这些事一开始做得很慢,可能比用图形界面慢十倍,但积累一段时间后,速度会反超,而且这个能力一旦长在身上,换个环境、换台服务器、换套系统,统统用得上。刷题只是一个开始,把命令行的思维方式带入日常生活,才是真正的通关。
