在使用命令行多年的过程中,我们往往局限于一些常用命令,很少深入探索其他强大的工具。最近,我花时间研究了一下命令行工具库,发现了许多鲜为人知但非常实用的命令。为了帮助大家更好地利用这些工具,我对它们进行了系统的整理和分类。如果你对提升命令行使用效率感兴趣,不妨收藏本文以备后用。
冷门但实用的命令
tldr
场景:获取命令的简明示例,比 man 更容易理解和上手。
tldr [命令名]
fd
场景:更现代、更快速、更用户友好的 find 替代品。
fd [模式] # 在当前目录搜索
fd [模式] [目录] # 在指定目录搜索
fd -e txt # 仅搜索扩展名为 txt 的文件
fzf
场景:通用的命令行模糊查找器,可交互式搜索文件、历史命令等。
fzf # 交互式搜索当前目录
cat file.txt | fzf # 在文本中搜索
history | fzf # 搜索命令历史
ripgrep (rg)
场景:比 grep 更快的文本搜索工具,支持正则表达式和递归搜索。
rg [模式] [文件/目录] # 递归搜索指定模式
rg -i [模式] # 不区分大小写搜索
rg -t py [模式] # 仅搜索 Python 文件
bat
场景:cat 的升级版,带有语法高亮、行号和 Git 集成。
bat [文件] # 查看文件内容
bat --plain [文件] # 无装饰查看
exa
场景:ls 的现代替代品,更多功能和更好的默认设置。
exa # 列出文件
exa -l # 详细列表
exa -T # 树状视图
exa --git # 显示 git 状态
ncdu
场景:磁盘使用分析工具,以交互方式显示磁盘使用情况。
ncdu [目录] # 分析指定目录的磁盘使用情况
htop
场景:增强版的 top,界面更友好,交互更强。
htop # 启动交互式进程查看器
mtr
场景:结合 ping 和 traceroute 功能的网络诊断工具。
mtr [主机] # 持续更新网络路径分析
jq
场景:命令行 JSON 处理工具,可用于格式化、过滤和转换 JSON 数据。
cat file.json | jq '.' # 格式化 JSON
curl -s api.example.com | jq '.items[].name' # 提取特定字段
rsync
场景:高效文件同步工具,只传输变更的部分。
rsync -avz [源路径] [目标路径] # 同步文件/目录
rsync -avz --delete [源路径]/ [目标路径]/ # 同步并删除目标中多余的文件
rsync -avz -e ssh [源路径] user@host:[目标路径] # 通过 SSH 同步
tmux
场景:终端复用器,支持多窗格、会话持久化。
tmux # 启动新会话
tmux new -s [会话名] # 创建命名会话
tmux attach -t [会话名] # 连接到指定会话
Ctrl+b c # 新建窗口
Ctrl+b % # 垂直分割窗格
Ctrl+b " # 水平分割窗格
ffmpeg
场景:强大的多媒体处理工具,可以转换、编辑音频和视频文件。
ffmpeg -i input.mp4 output.webm # 格式转换
ffmpeg -i input.mp4 -ss 00:00:30 -t 00:00:10 output.mp4 # 截取视频片段
ffmpeg -i input.mp4 -vf "scale=640:360" output.mp4 # 调整视频尺寸
asciinema
场景:录制和分享终端会话。
asciinema rec # 开始录制
asciinema play [文件] # 播放录制
pandoc
场景:文档格式转换工具,支持多种格式之间的转换。
pandoc input.md -o output.pdf # Markdown 转 PDF
pandoc input.docx -o output.md # Word 转 Markdown
httpie
场景:比 curl 更友好的 HTTP 客户端。
http GET example.com # GET 请求
http POST example.com/api name=John age:=25 # POST JSON 数据
watchexec
场景:监视文件变更并自动执行命令。
watchexec -e js,css,html -- npm start # 当文件变更时重启服务
文件和目录操作
ls
场景:列出目录内容。
ls [选项] [目录]
ls -la # 列出所有文件(包括隐藏文件)的详细信息
ls -lh # 以人类可读格式显示文件大小
cd
场景:切换工作目录。
cd [目录]
cd ~ # 进入 home 目录
cd - # 返回上一个工作目录
less
场景:分页查看文件内容。
less [文件名]
less /var/log/syslog # 查看系统日志
head
场景:查看文件开头部分。
head [选项] [文件名]
head -n 20 file.txt # 查看文件前 20 行
tail
场景:查看文件末尾部分或实时监控文件变化。
tail [选项] [文件名]
tail -f /var/log/nginx/access.log # 实时监控 Nginx 访问日志
tail -n 100 file.txt # 查看文件最后 100 行
ln
场景:创建文件链接。
ln -s [源文件] [链接名]
ln -s /usr/bin/python3 /usr/local/bin/python # 创建 Python 的软链接
chown
场景:更改文件所有者。
chown [用户]:[组] [文件]
chown -R user:group directory/ # 递归更改目录所有权
chmod
场景:更改文件权限。
chmod [权限] [文件]
chmod 755 script.sh # 设置可执行权限
chmod -R 644 directory/ # 递归设置目录内所有文件权限
du
场景:查看文件或目录占用的磁盘空间。
du [选项] [目录]
du -sh * # 显示当前目录下各项的总大小
du -h --max-depth=1 /var # 仅显示 /var 下一级目录的大小
df
场景:查看文件系统磁盘使用情况。
df [选项]
df -h # 以人类可读格式显示磁盘使用情况
df -i # 显示 inode 信息
find
场景:在文件系统中查找文件。
find [路径] [表达式]
find /home -name "*.txt" # 查找所有文本文件
find . -type f -mtime -7 # 查找 7 天内修改的文件
find . -size +100M # 查找大于 100MB 的文件
find . -name "*.log" -exec rm {} \; # 删除所有日志文件
Bash 快捷键和技巧
Tab 补全
场景:快速补全命令和文件名。 输入命令或文件名的开头,然后按 Tab 键自动补全。
ctrl-r
场景:搜索命令历史。 按 ctrl-r 然后输入关键字查找历史命令。
ctrl-w
场景:删除光标前的一个单词。 在命令行中按 ctrl-w 快速删除最后一个单词。
ctrl-u
场景:删除光标前的所有内容。 在命令行中按 ctrl-u 快速清除当前行。
ctrl-a
场景:将光标移到行首。 在命令行中按 ctrl-a 快速移动到行首。
ctrl-e
场景:将光标移到行尾。 在命令行中按 ctrl-e 快速移动到行尾。
ctrl-k
场景:删除光标后的所有内容。 在命令行中按 ctrl-k 删除光标位置到行尾的内容。
ctrl-l
场景:清屏。 在命令行中按 ctrl-l 清除屏幕内容,类似 clear 命令。
history
场景:查看命令历史。
history # 查看历史命令列表
!n # 执行历史命令列表中编号为 n 的命令
!-n # 执行倒数第 n 条命令
!! # 执行上一条命令
!string # 执行最近以 string 开头的命令
进程管理
&
场景:在后台运行命令。
[命令] &
python server.py & # 在后台运行 Python 服务器
ctrl-z
场景:暂停当前运行的进程。 在运行中的程序按 ctrl-z 将其挂起到后台。
ctrl-c
场景:终止当前运行的进程。 在运行中的程序按 ctrl-c 终止程序。
jobs
场景:查看后台作业状态。
jobs # 显示当前 shell 会话中的后台任务
jobs -l # 显示包括 PID 在内的详细信息
fg
场景:将后台作业移到前台。
fg [作业号] # 不指定作业号时,将最近的后台作业移到前台
fg %2 # 将作业 2 移到前台
bg
场景:让暂停的后台作业继续运行。
bg [作业号]
bg %1 # 让作业 1 在后台继续运行
kill
场景:发送信号终止进程。
kill [信号] [PID]
kill -9 1234 # 强制终止 PID 为 1234 的进程
killall firefox # 终止所有 Firefox 进程
pstree
场景:以树状图显示进程关系。
pstree [选项] [PID]
pstree -p # 显示所有进程及其 PID
pgrep
场景:根据名称查找进程。
pgrep [进程名]
pgrep -l nginx # 查找所有 nginx 进程并显示 PID 和进程名
pkill
场景:根据名称终止进程。
pkill [进程名]
pkill -9 firefox # 强制终止所有 Firefox 进程
nohup
场景:让命令在用户退出后继续运行。
nohup [命令] &
nohup python server.py > server.log 2>&1 & # 在后台运行且不受终端关闭影响,并重定向输出
disown
场景:使后台作业不受终端关闭影响。
[命令] & disown # 运行命令并立即使其不受终端影响
# 或
[命令] &
disown %[作业号] # 使已运行的后台作业不受终端影响
系统监控和调试
netstat
场景:显示网络连接信息。
netstat [选项]
netstat -tulpn # 显示所有监听的 TCP 和 UDP 端口及对应的程序
ss
场景:查看套接字统计信息(netstat 的替代)。
ss [选项]
ss -plat # 查看所有 TCP 监听套接字
ss -s # 显示统计信息
lsof
场景:列出打开的文件和网络连接。
lsof [选项]
lsof -i:80 # 查看占用 80 端口的进程
lsof -p 1234 # 查看 PID 为 1234 的进程打开的文件
uptime
场景:查看系统运行时间和负载。
uptime # 显示系统已运行的时间和平均负载
w
场景:显示当前登录用户和他们的活动。
w # 查看登录用户及其正在执行的命令
top
场景:实时显示系统资源使用情况。
top # 显示 CPU、内存使用率和进程列表
top -u username # 仅显示特定用户的进程
iostat
场景:报告 CPU 和磁盘 I/O 统计信息。
iostat [选项]
iostat -mxz 5 # 每 5 秒显示一次磁盘和 CPU 使用情况
iotop
场景:监控磁盘 I/O 使用情况。
iotop [选项]
iotop -o # 仅显示正在执行 I/O 的进程
dstat
场景:全面的系统资源统计。
dstat # 实时显示 CPU、磁盘、网络、I/O 和系统统计信息
dstat -cdngy # 仅显示 CPU、磁盘、网络、页面和系统统计信息
free
场景:显示内存使用情况。
free -h # 以人类可读格式显示内存使用情况
vmstat
场景:报告虚拟内存统计信息。
vmstat [间隔] [次数]
vmstat 1 5 # 每 1 秒显示一次,共 5 次
高级文本处理
awk
场景:强大的文本处理工具,适合处理结构化数据。
awk [模式] {动作} [文件]
awk '{print $1, $3}' file.txt # 打印第一列和第三列
awk -F, '{sum+=$3} END {print sum}' data.csv # 计算 CSV 文件第三列的总和
sed
场景:流编辑器,用于文本替换和修改。
sed [选项] [命令] [文件]
sed 's/old/new/g' file.txt # 全局替换文本
sed -i.bak 's/pattern/replacement/g' file.txt # 替换并备份原文件
sed '1,10d' file.txt # 删除前 10 行
cut
场景:从文件的每一行中提取部分内容。
cut [选项] [文件]
cut -d',' -f1,3 file.csv # 从 CSV 文件中提取第一和第三列
cut -c1-10 file.txt # 提取每行的前 10 个字符
paste
场景:合并文件的行。
paste [选项] [文件]
paste file1 file2 # 将两个文件的每一行合并在一起
paste -d':' file1 file2 # 使用冒号作为分隔符合并文件
join
场景:基于共同字段合并两个文件的行。
join [选项] [文件1] [文件2]
join -t, -1 2 -2 1 file1.csv file2.csv # 基于 file1 的第二列和 file2 的第一列合并 CSV 文件
sort
场景:对文件行进行排序。
sort [选项] [文件]
sort -k2,2 file.txt # 按第二列排序
sort -k2n file.txt # 按第二列数值排序
sort -u file.txt # 排序并删除重复行
uniq
场景:报告或忽略重复的行。
uniq [选项] [文件]
sort file.txt | uniq # 删除重复行(需要先排序)
sort file.txt | uniq -c # 统计每行出现的次数
sort file.txt | uniq -d # 仅显示重复的行
wc
场景:计算文件的行数、单词数和字节数。
wc [选项] [文件]
wc -l file.txt # 统计文件行数
wc -w file.txt # 统计文件单词数
wc -c file.txt # 统计文件字节数
tee
场景:读取标准输入并写入文件和标准输出。
[命令] | tee [文件]
ls -la | tee listing.txt # 同时显示和保存目录列表
tr
场景:转换或删除字符。
tr [选项] [字符集1] [字符集2]
tr 'a-z' 'A-Z' < file.txt # 将小写转换为大写
tr -d '\r' < file.txt > unix_file.txt # 删除回车符(Windows 到 Unix 转换)
xargs
场景:从标准输入构建和执行命令行。
[命令1] | xargs [命令2]
find . -name "*.txt" | xargs grep "pattern" # 在所有文本文件中搜索模式
find . -name "*.jpg" | xargs -I{} cp {} /backup/ # 复制所有 JPG 文件到备份目录
网络工具
ssh
场景:安全远程登录。
ssh [用户]@[主机]
ssh -p 2222 user@example.com # 使用非标准端口
ssh -i key.pem user@server # 使用密钥文件登录
scp
场景:安全地复制文件到远程主机。
scp [源文件] [用户]@[主机]:[目标路径]
scp -r local_dir user@example.com:/path/to/remote_dir # 递归复制整个目录
curl
场景:命令行网络请求工具。
curl [选项] [URL]
curl -O https://example.com/file.zip # 下载文件并保留原名
curl -X POST -d "data" https://api.example.com # 发送 POST 请求
curl -H "Content-Type: application/json" -d '{"key":"value"}' https://api.example.com # 发送 JSON 数据
wget
场景:网络文件下载工具。
wget [选项] [URL]
wget -c https://example.com/large_file.zip # 支持断点续传
wget -r -np -k https://example.com/ # 递归下载网站内容
ping
场景:测试主机的网络连通性。
ping [主机]
ping -c 5 google.com # 限制发送 5 个包
traceroute
场景:跟踪网络数据包到目标主机的路由路径。
traceroute [主机]
traceroute -n google.com # 不解析 IP 地址为主机名
nslookup
场景:查询 DNS 记录。
nslookup [域名]
nslookup -type=mx example.com # 查询邮件交换记录
dig
场景:DNS 查询工具,比 nslookup 提供更详细的信息。
dig [选项] [域名] [记录类型]
dig +short google.com # 简短显示查询结果
dig NS example.com # 查询名称服务器
压缩和归档
tar
场景:归档文件打包工具。
tar [选项] [文件]
tar -czvf archive.tar.gz directory/ # 创建 gzip 压缩归档
tar -xzvf archive.tar.gz # 解压 gzip 压缩归档
tar -cjvf archive.tar.bz2 directory/ # 创建 bzip2 压缩归档(更高压缩率)
gzip
场景:压缩文件。
gzip [文件]
gzip -9 file.txt # 最高压缩级别
gzip -d file.txt.gz # 解压文件(等同于 gunzip)
gunzip
场景:解压 gzip 文件。
gunzip [文件.gz]
gunzip file.txt.gz # 解压文件
zip
场景:创建 zip 归档。
zip [归档.zip] [文件]
zip -r archive.zip directory/ # 递归压缩目录
zip -e secure.zip file.txt # 创建加密 zip 文件
unzip
场景:解压 zip 归档。
unzip [归档.zip]
unzip archive.zip -d destination/ # 解压到指定目录
unzip -l archive.zip # 列出 zip 文件内容而不解压
基础命令
man
场景:需要查询命令的详细用法和说明文档。
man [命令名]
man grep # 查看 grep 命令的详细说明
man 5 passwd # 查看特定章节的手册页
apropos
场景:不确定命令名称,需要通过关键词搜索相关命令。
apropos [关键词]
apropos directory # 查找与目录相关的命令
help
场景:查看 Bash 内置命令的帮助信息。
help [命令名]
[命令名] --help # 许多命令支持 --help 参数
help cd # 查看 cd 命令帮助
type
场景:确定命令的类型(是否为别名、内置命令或可执行文件)。
type [命令名]
type -a ls # 显示所有可能的 ls 命令
which
场景:查找可执行文件的路径。
which [命令]
which -a python # 显示所有 python 可执行文件的路径
alias
场景:创建命令别名,简化常用命令。
alias [名称]=[命令]
alias ll='ls -la' # 创建 ll 别名
alias grep='grep --color=auto' # 使 grep 默认带颜色输出
mount
场景:挂载文件系统。
mount [选项] [设备] [挂载点]
mount /dev/sdb1 /mnt/usb # 挂载 USB 设备
mount -t nfs server:/share /mnt/nfs # 挂载 NFS 共享