命令行用了这么多年,原来还有这么多冷门实用的命令

157 阅读13分钟

在使用命令行多年的过程中,我们往往局限于一些常用命令,很少深入探索其他强大的工具。最近,我花时间研究了一下命令行工具库,发现了许多鲜为人知但非常实用的命令。为了帮助大家更好地利用这些工具,我对它们进行了系统的整理和分类。如果你对提升命令行使用效率感兴趣,不妨收藏本文以备后用。

冷门但实用的命令

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 共享