Shell 命令行实用技巧

一、目录导航与历史

1. pushd/popd - 目录栈管理

1
2
3
4
5
6
7
8
9
10
# 基本用法
pushd /tmp # 切换到 /tmp,同时保存当前目录
popd # 返回上一个保存的目录
dirs # 查看目录栈
dirs -c # 清空目录栈

# 实际应用场景
pushd /var/log # 临时去查看日志
# ... 做一些操作
popd # 立即回到原来的工作目录

2. 快速目录切换

1
2
3
cd -                    # 返回上一个目录(相当于 cd $OLDPWD)
cd # 回到家目录
cd ~user # 切换到指定用户的家目录

3. 命令历史技巧

1
2
3
4
5
6
7
8
9
10
11
12
# 历史搜索与重用
Ctrl+R # 反向搜索命令历史(超级实用!)
!! # 重复上一个命令
!$ # 上一个命令的最后一个参数
!^ # 上一个命令的第一个参数
!* # 上一个命令的所有参数
!n # 执行历史中第n条命令
!string # 执行最近以string开头的命令

# 快速修正命令
^old^new # 替换上一个命令中的old为new并执行
sudo !! # 给上一个命令加sudo重新执行

二、文件批量操作

1. rename - 正则表达式批量重命名

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 基本语法:rename 's/pattern/replacement/flags' files

# 预览模式(重要!)
rename -n 's/old/new/' *.txt # -n 只预览,不实际执行

# 基础替换
rename 's/old/new/' *.txt # 简单字符串替换
rename 's/old/new/g' *.txt # 全局替换(g标志)
rename 's/old/new/i' *.txt # 忽略大小写(i标志)

# 正则表达式应用
rename 's/\d+/NUM/' *.txt # 所有数字替换为NUM
rename 's/(\d+)/[$1]/' *.txt # 给数字加方括号:123 → [123]
rename 's/^/prefix_/' *.txt # 添加前缀
rename 's/\.txt$/.bak/' *.txt # 更改扩展名
rename 's/\s+/_/g' * # 空格替换为下划线
rename 's/[^a-zA-Z0-9._-]//g' * # 删除特殊字符

# 实用案例
rename 's/IMG_(\d{4})/Photo_$1/' *.jpg # IMG_1234.jpg → Photo_1234.jpg
rename 's/[()&\s]/_/g' * # 清理文件名特殊字符
rename 's/_v\d+\.\d+//' * # 移除版本号 _v1.0
rename 'y/A-Z/a-z/' *.TXT # 大小写转换

2. 其他文件操作技巧

1
2
3
4
5
6
7
8
9
10
11
12
13
# 快速备份文件
cp file.txt{,.bak} # 相当于 cp file.txt file.txt.bak
mv file.txt{,.old} # 相当于 mv file.txt file.txt.old

# 同时创建目录和文件
mkdir -p path/to/dir && touch path/to/dir/file.txt

# 批量创建文件
touch file{1..10}.txt # 创建 file1.txt 到 file10.txt
mkdir {dir1,dir2,dir3} # 创建多个目录

# 比较目录
diff -r dir1/ dir2/ # 递归比较两个目录

三、文件查找与分析

1. 磁盘使用分析

1
2
3
4
5
# 查找大文件/目录
du -sh * | sort -rh | head -10 # 当前目录下最大的10个
du -ah /path | sort -rh | head -20 # 指定路径下最大的20个文件
find /path -size +100M # 查找大于100M的文件
find /path -type f -exec du -h {} + | sort -rh | head -10

2. 文件内容搜索

1
2
3
4
5
6
7
# grep 高级用法
grep -r "pattern" /path # 递归搜索
grep -n "pattern" file # 显示行号
grep -v "pattern" file # 反向匹配(不包含pattern的行)
grep -c "pattern" file # 统计匹配行数
grep -l "pattern" *.txt # 只显示包含pattern的文件名
grep -B5 -A5 "pattern" file # 显示匹配行前后5行

3. 实时监控

1
2
3
tail -f /var/log/syslog             # 实时监控日志文件
watch -n 1 'ps aux | grep process' # 每秒监控进程状态
watch -n 5 'df -h' # 每5秒监控磁盘使用

四、进程与系统管理

1. 进程操作

1
2
3
4
5
6
7
8
9
10
# 后台运行
nohup command & # 后台运行,终端关闭也继续
command & # 简单后台运行
jobs # 查看后台任务
fg %1 # 将后台任务1调到前台
bg %1 # 将暂停的任务1放到后台运行

# 进程优先级
nice -n -10 command # 提高优先级运行
renice -10 -p PID # 调整已运行进程的优先级

2. 网络和端口

1
2
3
4
5
6
7
8
# 端口查看
lsof -i :8080 # 查看8080端口占用
ss -tulpn | grep :8080 # 同上,更快
netstat -tulpn | grep :8080 # 传统方法

# 文件占用查看
lsof filename # 查看文件被哪个进程打开
lsof -u username # 查看用户打开的文件

五、输入输出重定向

1. 标准重定向

1
2
3
4
5
6
7
8
9
# 基本重定向
command > output.txt # 重定向标准输出
command 2> error.txt # 重定向标准错误
command &> all.txt # 重定向所有输出
command >> append.txt # 追加模式

# 同时输出到文件和屏幕
command | tee output.txt # 既显示又保存
command | tee -a output.txt # 追加模式

2. Here Document

1
2
3
4
5
6
7
8
9
10
11
# 多行输入
cat << EOF > file.txt
这是第一行
这是第二行
变量也可以:$USER
EOF

# 不解析变量的版本
cat << 'EOF' > file.txt
这里$USER不会被解析
EOF

六、文本处理

1. 列操作

1
2
3
4
5
# 列提取和格式化
cut -d',' -f2,4 file.csv # 提取CSV的第2和4列
cut -c1-10 file.txt # 提取每行的第1-10个字符
column -t file.csv # 美化表格显示
column -t -s',' file.csv # 指定分隔符

2. 排序和去重

1
2
3
4
5
6
7
8
9
sort file.txt | uniq                # 排序并去重
sort -u file.txt # 直接排序去重
sort -n numbers.txt # 数字排序
sort -k2 file.txt # 按第2列排序
sort -rh sizes.txt # 按人类可读大小倒序

# 统计重复
sort file.txt | uniq -c # 统计每行出现次数
sort file.txt | uniq -d # 只显示重复的行

3. 快速统计

1
2
3
wc -l < file.txt                    # 只显示行数,不显示文件名
wc -w file.txt # 统计单词数
wc -c file.txt # 统计字符数

五、快捷键大全

1. 光标移动

1
2
3
4
5
6
Ctrl+A          # 光标移到行首
Ctrl+E # 光标移到行尾
Ctrl+F # 光标向前移动一个字符
Ctrl+B # 光标向后移动一个字符
Alt+F # 光标向前移动一个单词
Alt+B # 光标向后移动一个单词

2. 文本编辑

1
2
3
4
5
Ctrl+K          # 删除光标到行尾
Ctrl+U # 删除整行
Ctrl+W # 删除光标前的单词
Alt+D # 删除光标后的单词
Ctrl+Y # 粘贴最近删除的内容

3. 特殊功能

1
2
3
4
5
6
7
Ctrl+R          # 历史搜索(强烈推荐!)
Ctrl+G # 取消当前搜索
Ctrl+L # 清屏
Ctrl+C # 终止当前命令
Ctrl+Z # 暂停当前命令
Alt+. # 插入上一个命令的最后一个参数
Ctrl+X Ctrl+E # 用编辑器编辑当前命令行

七、变量和环境

1. 变量操作

1
2
3
4
5
6
7
8
9
10
11
# 默认值和替换
echo ${VAR:-default} # VAR未设置时使用默认值
echo ${VAR:=default} # VAR未设置时设置并使用默认值
echo ${VAR:+set_value} # VAR已设置时使用set_value

# 字符串操作
echo ${VAR#prefix} # 删除最短前缀匹配
echo ${VAR##prefix} # 删除最长前缀匹配
echo ${VAR%suffix} # 删除最短后缀匹配
echo ${VAR%%suffix} # 删除最长后缀匹配
echo ${#VAR} # 字符串长度

2. 临时环境变量

1
2
3
VAR=value command                   # 仅对该命令设置环境变量
export VAR=value # 设置环境变量
unset VAR # 删除变量

八、实用组合技巧

1. 一行解决复杂问题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 查找并删除空文件
find . -empty -type f -delete

# 查找最近修改的文件
find . -type f -mtime -1 | head -10

# 批量压缩当前目录下的文件夹
for dir in */; do tar -czf "${dir%/}.tar.gz" "$dir"; done

# 快速HTTP服务器(Python)
python3 -m http.server 8000

# 查看目录树结构
tree -L 2 # 或者 find . -type d | head -20

# 统计代码行数
find . -name "*.py" | xargs wc -l | tail -1

2. 系统信息快查

1
2
3
4
5
6
7
# 系统资源
free -h # 内存使用
df -h # 磁盘使用
lscpu # CPU信息
lsblk # 块设备信息
ps aux --sort=-%cpu | head -10 # CPU占用前10的进程
ps aux --sort=-%mem | head -10 # 内存占用前10的进程