写在前面

用 AI 辅助编码时(比如 Claude Code、Cursor),AI 经常会给出各种 Shell 命令:export 设置环境变量、source 激活环境、grep 搜索代码……如果不清楚这些命令的含义,就只能盲目复制粘贴。这篇笔记按功能分类梳理这些常见命令,让与 AI 的协作更高效。

文件与目录操作

cd — 切换工作目录

1
2
3
4
5
cd ~/projects/vrp_solver   # 进入项目目录
cd ..                       # 返回上一级
cd -                        # 回到上一次所在的目录(高频操作)
cd ~                        # 回到主目录
pwd                         # 显示当前路径

运行脚本时,程序会从当前目录读取数据文件,用 cd 确保你在正确的位置。

cat — 查看文件内容

快速显示文件的全部内容:

1
2
3
cat config.yaml            # 显示文件内容
cat -n config.yaml         # 带行号显示
cat a.txt b.txt > c.txt    # 合并多个文件

查看大文件时,cat 会一次性全部输出,建议改用 less(分页浏览)或 head/tail(只看头尾):

1
2
3
less large.log             # 分页浏览,按 q 退出
head -20 large.log         # 只看前 20 行
tail -f app.log            # 实时追踪文件末尾(看日志常用)

文本搜索与处理

grep — 文本搜索

grep(global regular expression print)在文件或文本中搜索匹配特定模式的行,相当于命令行里的 Ctrl+F。

基本语法:

1
grep "关键词" 文件名

常用选项

选项作用示例
-i忽略大小写grep -i "error" log.txt
-n显示行号grep -n "timeout" config.py
-r递归搜索子目录grep -r "GUROBI" ./projects/
-v反向匹配(排除)grep -v "#" config.txt
-l只输出文件名grep -l "main" *.py
-c统计匹配行数grep -c "Optimal" results.txt
-E支持扩展正则grep -E "A|B" file

正则表达式

grep 支持正则匹配,加 -E 可以使用扩展正则:

1
2
3
grep "^NODE" instance.vrp          # ^ 匹配行首,找以 NODE 开头的行
grep -E "Optimal|Infeasible" log   # | 表示 OR,匹配多个关键词
grep "[0-9]\{4\}" data.txt         # 匹配四位数字

实际场景

1
2
3
4
5
6
7
8
9
# 检查求解器是否找到最优解
grep "Optimal solution found" gurobi.log

# 批量检查实验结果
grep "infeasible" result_*.txt

# 配合管道使用
history | grep claude
env | grep TASK

wc — 统计行数/词数/字节数

1
2
3
wc -l data.csv             # 统计行数(常用:快速知道数据集有多少行)
wc -w readme.md            # 统计词数
wc -l *.py                 # 统计每个 Python 文件的行数

sort — 排序

1
2
3
4
sort results.txt                   # 按字母排序
sort -n results.txt                # 按数值排序(默认是字典序,数字 9 会排在 10 后面)
sort -rn results.txt               # 按数值倒序
sort -t, -k2 data.csv              # 以逗号分隔,按第 2 列排序

uniq — 去重

通常跟 sort 搭配使用(uniq 只去除相邻的重复行):

1
2
3
sort names.txt | uniq              # 排序并去重
sort names.txt | uniq -c           # 去重并统计每个值出现的次数
sort names.txt | uniq -d           # 只显示重复的行

cut — 提取列/字段

1
2
3
cut -d, -f1 data.csv               # 以逗号分隔,提取第 1 列
cut -d: -f1,3 /etc/passwd          # 以冒号分隔,提取第 1 和 3 列
cut -c1-10 file.txt                # 提取每行的前 10 个字符

tr — 字符替换

1
2
3
echo "hello world" | tr 'a-z' 'A-Z'    # 转大写
cat file.txt | tr '\t' ','              # Tab 替换为逗号
cat file.txt | tr -d '\r'               # 删除 Windows 换行符 (\r)

sed — 流编辑器,批量替换

AI 辅助编码中最常见的用法是批量替换文件中的文本:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# 替换文件中的文本(不会修改原文件,只输出结果)
sed 's/old/new/' file.txt

# 直接修改文件(-i)
sed -i '' 's/old/new/g' file.txt      # macOS 写法
sed -i 's/old/new/g' file.txt         # Linux 写法

# 删除空行
sed '/^$/d' file.txt

# 删除第 5 行
sed '5d' file.txt

awk — 模式扫描与处理

功能强大,这里只列最常用的场景:

1
2
3
4
5
6
7
8
# 按列提取(以空格/tab 分隔)
awk '{print $1, $3}' data.txt         # 打印第 1 和第 3 列

# 指定分隔符
awk -F, '{print $2}' data.csv         # 以逗号分隔,打印第 2 列

# 带条件的处理
awk '$3 > 100 {print $1}' data.txt    # 第 3 列大于 100 时,打印第 1 列

组合使用

这些命令配合管道可以完成复杂的数据处理:

1
2
3
4
5
# 从日志中提取状态码,排序并统计频次
grep "HTTP" access.log | awk '{print $9}' | sort | uniq -c | sort -rn

# 统计 CSV 文件中有多少个不同的城市
cut -d, -f3 data.csv | sort | uniq | wc -l

环境与进程管理

export — 设置环境变量

让后续启动的子进程能读取到该变量:

1
2
3
4
5
# 设置环境变量
export GRB_LICENSE_FILE=/path/to/gurobi.lic

# 查看已设置的变量
env | grep GRB

注意区分:

  • VAR=value — 只在当前 shell 有效,子进程看不到
  • export VAR=value — 子进程也能继承

持久化export 设置的变量在关闭终端后就消失了。要永久生效,需要写入 ~/.zshrc(zsh)或 ~/.bashrc(bash),然后 source 使其生效。

很多求解器(Gurobi/CPLEX)都通过环境变量读取许可证或配置。

source — 在当前 shell 中执行脚本

脚本中的变量和设置会直接影响当前终端环境:

1
2
3
4
5
# 重新加载 shell 配置(修改 ~/.zshrc 后执行)
source ~/.zshrc

# 激活 Python 虚拟环境
source venv/bin/activate

source 也可以写成 .,两者等价:

1
. ~/.zshrc              # 等同于 source ~/.zshrc

对比:直接运行 ./script.sh 会在新进程中执行,退出后变量失效;source 则保留在当前 shell 中。

信息查询

history — 查看历史命令

1
2
history                 # 显示最近命令
history | grep python   # 搜索含 "python" 的历史命令

快捷技巧:

  • ↑/↓ 方向键浏览历史
  • !! 重复上一条命令
  • !n 重新执行第 n 条命令

type — 查看命令类型

1
2
3
type cd      # cd is a shell builtin
type cat     # cat is /bin/cat
type ll      # ll is an alias for ls -l

这引出了一个冷知识:Shell 命令其实分为内置命令(由 shell 自己实现,如 cdexportsource)和外部命令(磁盘上的可执行文件,如 catgrepgit)。日常使用中不需要区分,但遇到"为什么 cd 找不到可执行文件"这类问题时,type 能帮你快速定位。

总结

分类命令用途
文件与目录cd, cat, less, head, tail切换目录、查看文件内容
文本搜索与处理grep, wc, sort, uniq, cut, tr, sed, awk搜索、统计、排序、替换、提取
环境与进程export, source设置变量、加载脚本
信息查询history, type查看历史、查看命令类型