Shell命令是Linux/Unix系统中最基础也是最强大的工具。无论是系统管理员、开发人员还是DevOps工程师,熟练掌握Shell命令都是必备技能。本文档全面覆盖常用Shell命令的使用方法、实战技巧和最佳实践。
ls 是最常用的命令之一,用于列出目录中的文件和子目录。
基本用法:
ls # 列出当前目录内容
ls /path/to/dir # 列出指定目录内容
ls -l # 长格式显示(详细信息)
ls -a # 显示所有文件,包括隐藏文件
ls -la # 组合使用:长格式+显示隐藏文件
ls -lh # 人类可读的文件大小(K、M、G)
ls -lt # 按修改时间排序(最新的在前)
ls -ltr # 按修改时间倒序(最旧的在前)
ls -R # 递归列出子目录内容
输出字段解释:
-rw-r--r-- 1 user group 1234 Jan 15 10:30 filename
│└┬┘└┬┘└┬┘ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ │ │ └── 文件名
│ │ │ │ │ │ │ │ │ └──────── 修改时间
│ │ │ │ │ │ │ │ └──────────── 修改日期
│ │ │ │ │ │ │ └───────────────── 文件大小(字节)
│ │ │ │ │ │ └─────────────────────── 所属组
│ │ │ │ │ └──────────────────────────── 所有者
│ │ │ │ └─────────────────────────────── 硬链接数
│ │ │ └─────────────────────────────────── 其他用户权限
│ │ └────────────────────────────────────── 组用户权限
│ └───────────────────────────────────────── 所有者权限
└─────────────────────────────────────────── 文件类型(-文件,d目录,l链接)
实用别名:
alias ll='ls -alF' # 常用别名,许多发行版已预定义
alias la='ls -A'
alias l='ls -CF'
cd /path/to/directory # 切换到指定目录
cd ~ # 切换到用户主目录
cd # 同上(默认切换到主目录)
cd - # 切换到上次所在的目录
cd .. # 切换到上级目录
cd ../.. # 切换到上两级目录
pwd # 显示当前工作目录的完整路径
pwd -P # 显示物理路径(解析所有符号链接)
mkdir dirname # 创建单个目录
mkdir dir1 dir2 dir3 # 创建多个目录
mkdir -p parent/child # 递归创建目录(父目录不存在时自动创建)
mkdir -m 755 dirname # 创建目录并设置权限
rm file.txt # 删除文件
rm file1.txt file2.txt # 删除多个文件
rm -i file.txt # 交互式删除(删除前询问)
rm -f file.txt # 强制删除(不提示,忽略不存在的文件)
rm -r directory/ # 递归删除目录及其内容
rm -rf directory/ # 强制递归删除(慎用!)
⚠️ 警告: rm -rf / 会删除整个文件系统!使用时要格外小心。
cp source.txt dest.txt # 复制文件
cp file.txt /path/to/dir/ # 复制文件到目录
cp file1.txt file2.txt /dir/ # 复制多个文件到目录
cp -r source_dir/ dest_dir/ # 递归复制目录
cp -i file.txt dest.txt # 覆盖前询问
cp -v file.txt dest.txt # 显示详细过程
cp -p file.txt dest.txt # 保留文件属性(时间戳、权限等)
cp -u file.txt dest.txt # 仅在源文件较新时复制
mv oldname.txt newname.txt # 重命名文件
mv file.txt /path/to/dir/ # 移动文件到目录
mv file1.txt file2.txt /dir/ # 移动多个文件到目录
mv -i source.txt dest.txt # 覆盖前询问
mv -v source.txt dest.txt # 显示详细过程
mv -f source.txt dest.txt # 强制覆盖
touch newfile.txt # 创建空文件
touch file1.txt file2.txt # 创建多个空文件
touch -t 202401151200 file.txt # 设置指定时间戳(YYYYMMDDHHMM)
touch -c file.txt # 不创建新文件,仅修改现有文件时间戳
cat file.txt # 显示文件内容
cat file1.txt file2.txt # 连接多个文件并显示
cat -n file.txt # 显示行号
cat -E file.txt # 显示行尾符($)
cat > newfile.txt # 从标准输入创建文件(Ctrl+D结束)
cat file1.txt file2.txt > combined.txt # 合并文件
less file.txt # 分页查看(支持上下滚动)
more file.txt # 分页查看(仅向下滚动)
less +F file.txt # 实时监控文件(类似tail -f)
less -N file.txt # 显示行号
less常用快捷键:
Space 或 Page Down:向下翻页Page Up:向上翻页↓ 或 j:向下滚动一行↑ 或 k:向上滚动一行/pattern:向下搜索?pattern:向上搜索n:下一个匹配N:上一个匹配q:退出head file.txt # 显示前10行
head -n 20 file.txt # 显示前20行
head -20 file.txt # 同上
head -c 100 file.txt # 显示前100字节
tail file.txt # 显示后10行
tail -n 20 file.txt # 显示后20行
tail -f file.txt # 实时监控文件新增内容
tail -F file.txt # 实时监控(文件被删除重建后继续监控)
tail -n 100 file.txt head -20 # 显示第81-100行
grep 是强大的文本搜索工具,支持正则表达式。
grep "pattern" file.txt # 在文件中搜索模式
grep -i "pattern" file.txt # 忽略大小写
grep -v "pattern" file.txt # 反向匹配(显示不匹配的行)
grep -n "pattern" file.txt # 显示行号
grep -c "pattern" file.txt # 统计匹配行数
grep -r "pattern" /path/ # 递归搜索目录
grep -l "pattern" *.txt # 只显示包含匹配的文件名
grep -w "word" file.txt # 匹配整个单词
grep -E "pattern1pattern2" # 扩展正则表达式(或匹配)
grep -A 3 "pattern" file.txt # 显示匹配行及后3行
grep -B 3 "pattern" file.txt # 显示匹配行及前3行
grep -C 3 "pattern" file.txt # 显示匹配行及前后3行
常用正则表达式:
grep "^start" file.txt # 以"start"开头的行
grep "end$" file.txt # 以"end"结尾的行
grep "^$" file.txt # 空行
grep "[0-9]" file.txt # 包含数字的行
grep -E "\bword\b" file.txt # 匹配单词边界
sed 用于对文本进行过滤和转换。
sed 's/old/new/' file.txt # 替换每行第一个匹配
sed 's/old/new/g' file.txt # 替换所有匹配
sed 's/old/new/gi' file.txt # 全局替换,忽略大小写
sed -i 's/old/new/g' file.txt # 直接修改文件
sed -n '5p' file.txt # 打印第5行
sed -n '5,10p' file.txt # 打印第5-10行
sed '5d' file.txt # 删除第5行
sed '/pattern/d' file.txt # 删除匹配行
sed 's/^/prefix/' file.txt # 行首添加前缀
sed 's/$/suffix/' file.txt # 行尾添加后缀
sed 's/ *$//' file.txt # 删除行尾空格
awk 是强大的文本分析工具,特别适合处理结构化数据。
awk '{print $1}' file.txt # 打印第一列
awk '{print $1, $3}' file.txt # 打印第1和第3列
awk -F: '{print $1}' /etc/passwd # 指定分隔符为冒号
awk '{print NF}' file.txt # 打印每列的字段数
awk '{print $NF}' file.txt # 打印最后一列
awk 'NR==5' file.txt # 打印第5行
awk 'NR>=5 && NR<=10' file.txt # 打印第5-10行
awk '/pattern/' file.txt # 打印匹配行
awk '!/pattern/' file.txt # 打印不匹配行
awk '{sum+=$1} END {print sum}' # 求第一列的和
awk '{print NR": "$0}' file.txt # 添加行号
sort file.txt # 按字母顺序排序
sort -r file.txt # 反向排序
sort -n file.txt # 按数字排序
sort -k 2 file.txt # 按第2列排序
sort -t: -k 3 -n /etc/passwd # 指定分隔符,按第3列数字排序
sort -u file.txt # 去重排序
sort -f file.txt # 忽略大小写排序
sort file.txt | uniq # 排序后去重
uniq file.txt # 去除相邻重复行
uniq -c file.txt # 统计每行出现次数
uniq -d file.txt # 只显示重复行
uniq -u file.txt # 只显示不重复的行
sort file.txt | uniq # 完全去重(先排序)
sort file.txt | uniq -c | sort -nr # 统计频率并排序
wc file.txt # 统计行数、单词数、字节数
wc -l file.txt # 只统计行数
wc -w file.txt # 只统计单词数
wc -c file.txt # 只统计字节数
wc -m file.txt # 只统计字符数
ls | wc -l # 统计文件数量
cut -d: -f1 /etc/passwd # 按冒号分隔,取第1字段
cut -d: -f1,3 /etc/passwd # 取第1和第3字段
cut -c1-10 file.txt # 取每行前10个字符
cut -c5- file.txt # 取每行第5个字符之后
cut -c-5 file.txt # 取每行前5个字符
echo "hello" | tr 'a-z' 'A-Z' # 小写转大写
echo "HELLO" | tr 'A-Z' 'a-z' # 大写转小写
echo "hello" | tr -d 'l' # 删除字符
echo "hello" | tr -s 'l' # 压缩连续重复字符
tr -d '\n' < file.txt # 删除所有换行符
cat file.txt | tr ' ' '\n' # 空格转换行
top # 显示系统进程和资源使用
htop # 增强版top(需安装)
top常用交互命令:
q:退出k:杀死进程r:修改进程优先级M:按内存排序P:按CPU排序T:按运行时间排序1:显示每个CPU核心ps aux # 显示所有进程的详细信息
ps -ef # 标准格式显示所有进程
ps aux | grep nginx # 查找特定进程
ps aux --sort=-%cpu | head -10 # 按CPU使用率排序,取前10
ps aux --sort=-%mem | head -10 # 按内存使用率排序,取前10
ps -p PID -o pid,ppid,cmd,%mem,%cpu # 查看指定进程信息
df # 显示文件系统磁盘空间
df -h # 人类可读格式
df -T # 显示文件系统类型
df -i # 显示inode使用情况
df -h /home # 查看指定目录所在文件系统
du # 显示目录大小
du -h # 人类可读格式
du -sh /path/to/dir # 显示目录总大小
du -h --max-depth=1 /path # 显示一级子目录大小
du -ah /path | sort -rh | head -20 # 显示最大的20个文件/目录
free # 显示内存使用情况
free -h # 人类可读格式
free -m # 以MB为单位
free -g # 以GB为单位
free -t # 显示总计
watch -n 1 free -h # 每秒刷新显示
vmstat # 显示系统整体状态
vmstat 1 # 每秒刷新
vmstat 1 10 # 每秒刷新,共10次
vmstat -s # 显示事件计数器
vmstat -d # 显示磁盘统计
iostat # 显示CPU和IO统计
iostat -x # 显示扩展统计
iostat -d 1 # 每秒显示磁盘统计
iostat -p sda # 显示指定磁盘统计
uptime # 显示系统运行时间、负载
uptime -p # 以可读格式显示运行时间
uname # 显示内核名称
uname -a # 显示所有系统信息
uname -r # 显示内核版本
uname -m # 显示机器硬件名称
uname -n # 显示主机名
ping google.com # 持续ping
ing -c 4 google.com # ping 4次
ping -i 2 google.com # 每2秒ping一次
ping -s 1024 google.com # 指定数据包大小
curl https://example.com # 获取网页内容
curl -o file.html https://example.com # 保存到文件
curl -O https://example.com/file.zip # 保留远程文件名
curl -L https://example.com # 跟随重定向
curl -I https://example.com # 只获取响应头
curl -v https://example.com # 显示详细过程
curl -X POST -d "key=value" https://api.example.com # POST请求
curl -H "Authorization: Bearer token" https://api.example.com # 自定义请求头
curl -u username:password https://example.com # 基本认证
curl -k https://example.com # 忽略SSL证书验证
wget https://example.com/file.zip # 下载文件
wget -O newname.zip https://example.com/file.zip # 指定保存名
wget -c https://example.com/file.zip # 断点续传
wget -b https://example.com/file.zip # 后台下载
wget --limit-rate=200k https://example.com/file.zip # 限速下载
wget -r -np -nd https://example.com/dir/ # 递归下载
wget --mirror https://example.com # 镜像网站
netstat -tuln # 显示监听端口
netstat -an # 显示所有连接
netstat -rn # 显示路由表
netstat -i # 显示网络接口统计
netstat -s # 显示网络协议统计
ss -tuln # 显示监听端口(更快)
ss -s # 显示套接字统计
ss -ti # 显示TCP内部信息
ss -o state established '( dport = :ssh or sport = :ssh )' # 显示SSH连接
lsof # 列出所有打开的文件
lsof -u username # 列出某用户打开的文件
lsof -p PID # 列出某进程打开的文件
lsof -i :80 # 列出使用80端口的进程
lsof -i TCP # 列出所有TCP连接
lsof +D /path # 列出目录下被打开的文件
lsof | grep deleted # 查找已删除但仍被占用的文件
ifconfig # 显示所有网络接口
ifconfig eth0 # 显示指定接口
ifconfig eth0 up # 启用接口
ifconfig eth0 down # 禁用接口
ip addr # 显示IP地址
ip addr show eth0 # 显示指定接口
ip link # 显示链路状态
ip route # 显示路由表
ip neigh # 显示ARP表
ip -s link # 显示接口统计
traceroute google.com # 追踪路由路径
traceroute -I google.com # 使用ICMP
traceroute -T -p 80 google.com # 使用TCP,指定端口
mtr google.com # 实时路由追踪(需安装)
mtr -r google.com # 生成报告模式
nc -zv hostname 80 # 测试端口连通性
nc -zv hostname 1-1000 # 扫描端口范围
nc -l 8080 # 监听8080端口
nc hostname 80 # 连接到远程端口
nc -l 8080 > file.txt # 接收文件
nc hostname 8080 < file.txt # 发送文件
dig example.com # 查询DNS记录
dig +short example.com # 简短输出
dig @8.8.8.8 example.com # 指定DNS服务器
dig -x 8.8.8.8 # 反向DNS查询
dig example.com MX # 查询MX记录
dig example.com ANY # 查询所有记录
nslookup example.com # 查询DNS
nslookup -type=mx example.com # 查询MX记录
chmod 755 file.txt # 设置权限为rwxr-xr-x
chmod u+x script.sh # 给所有者添加执行权限
chmod go-w file.txt # 移除组和其他人的写权限
chmod -R 755 directory/ # 递归修改目录权限
chmod 644 file.txt # rw-r--r--(普通文件常用)
chmod 600 file.txt # rw-------(敏感文件)
权限数字对应:
组合:7(rwx)、6(rw-)、5(r-x)、4(r--)、0(---)
chown user file.txt # 修改文件所有者
chown user:group file.txt # 修改所有者和组
chown :group file.txt # 只修改组
chown -R user:group directory/ # 递归修改
chown --reference=file1 file2 # 参考file1的权限设置file2
chgrp group file.txt # 修改文件所属组
chgrp -R group directory/ # 递归修改
umask # 显示当前掩码
umask 022 # 设置掩码(文件默认644,目录755)
umask 077 # 设置掩码(文件默认600,目录700)
useradd username # 创建用户
useradd -m username # 创建用户并创建主目录
useradd -m -s /bin/bash username # 指定shell
useradd -u 1001 -g groupname username # 指定UID和GID
usermod -aG groupname username # 将用户添加到附加组
usermod -s /bin/zsh username # 修改用户shell
usermod -L username # 锁定用户
usermod -U username # 解锁用户
userdel username # 删除用户
userdel -r username # 删除用户及其主目录
passwd # 修改当前用户密码
passwd username # 修改指定用户密码(root)
passwd -l username # 锁定用户密码
passwd -u username # 解锁用户密码
passwd -d username # 删除用户密码
passwd -e username # 强制用户下次登录修改密码
groups # 显示当前用户所属组
groups username # 显示指定用户所属组
id # 显示当前用户ID信息
id username # 显示指定用户ID信息
whoami # 显示当前用户名
who # 显示当前登录用户
w # 显示登录用户及其活动
last # 显示最近登录记录
sudo command # 以root权限执行命令
sudo -i # 切换到root用户
sudo -u username command # 以指定用户执行命令
sudo -s # 以root权限启动shell
su - # 切换到root(需root密码)
su - username # 切换到指定用户
kill PID # 发送TERM信号终止进程
kill -9 PID # 强制终止进程(SIGKILL)
kill -15 PID # 正常终止(SIGTERM,默认)
kill -1 PID # 重新加载配置(SIGHUP)
killall process_name # 按名称终止进程
pkill pattern # 按模式匹配终止进程
pkill -f "python app.py" # 匹配完整命令行
killall -9 process_name # 强制终止
nice -n 10 command # 以较低优先级运行命令
renice -n 5 -p PID # 修改进程优先级
renice -n -5 -u username # 修改用户所有进程优先级
优先级范围:-20(最高)到 19(最低),默认0。
nohup command & # 忽略挂起信号,后台运行
nohup python script.py > output.log 2>&1 & # 重定向输出
command & # 后台运行
bg # 将暂停的作业放到后台
fg # 将后台作业放到前台
fg %1 # 将作业1放到前台
disown %1 # 从shell作业表中移除
jobs # 列出所有作业
jobs -l # 列出作业及PID
fg %1 # 将作业1放到前台
bg %1 # 将作业1放到后台运行
Ctrl+Z # 暂停当前前台作业
screen:
screen # 创建新会话
screen -S name # 创建命名会话
screen -ls # 列出所有会话
screen -r name # 恢复会话
screen -d -r name # 分离并恢复会话
Ctrl+a, d # 分离当前会话
Ctrl+a, c # 创建新窗口
Ctrl+a, n # 下一个窗口
Ctrl+a, p # 上一个窗口
Ctrl+a, " # 列出所有窗口
Ctrl+a, k # 关闭当前窗口
tmux:
tmux # 创建新会话
tmux new -s name # 创建命名会话
tmux ls # 列出所有会话
tmux attach -t name # 附加到会话
tmux detach # 分离会话
Ctrl+b, d # 分离会话
Ctrl+b, c # 创建新窗口
Ctrl+b, n # 下一个窗口
Ctrl+b, p # 上一个窗口
Ctrl+b, % # 垂直分割
Ctrl+b, " # 水平分割
Ctrl+b, o # 切换窗格
Ctrl+b, x # 关闭当前窗格
tar -cvf archive.tar files/ # 创建tar归档
tar -cvzf archive.tar.gz files/ # 创建gzip压缩的tar归档
tar -cvjf archive.tar.bz2 files/ # 创建bzip2压缩的tar归档
tar -xvf archive.tar # 解压tar归档
tar -xvzf archive.tar.gz # 解压gzip压缩的归档
tar -xvjf archive.tar.bz2 # 解压bzip2压缩的归档
tar -tvf archive.tar # 列出归档内容
tar -rvf archive.tar newfile # 向归档添加文件
tar -cvzf archive.tar.gz --exclude='*.log' files/ # 排除文件
选项说明:
-c:创建归档-x:解压归档-t:列出内容-v:详细模式-f:指定文件名-z:gzip压缩/解压-j:bzip2压缩/解压-J:xz压缩/解压gzip file.txt # 压缩文件(生成file.txt.gz)
gzip -k file.txt # 压缩但保留原文件
gzip -d file.txt.gz # 解压
gunzip file.txt.gz # 解压
gzip -r directory/ # 递归压缩目录
gzip -9 file.txt # 最高压缩级别(1-9)
gzip -l file.txt.gz # 显示压缩信息
zip archive.zip file1 file2 # 创建zip归档
zip -r archive.zip directory/ # 递归压缩目录
zip -e archive.zip files/ # 加密压缩
unzip archive.zip # 解压
unzip archive.zip -d /path # 解压到指定目录
unzip -l archive.zip # 列出内容
unzip -o archive.zip # 覆盖现有文件
bzip2 file.txt # 压缩文件
bzip2 -k file.txt # 压缩但保留原文件
bzip2 -d file.txt.bz2 # 解压
bunzip2 file.txt.bz2 # 解压
find /path -name "file.txt" # 按名称查找
find /path -name "*.txt" # 使用通配符
find /path -iname "file.txt" # 忽略大小写
find /path -type f # 只查找文件
find /path -type d # 只查找目录
find /path -type l # 只查找链接
find /path -size +100M # 查找大于100MB的文件
find /path -size -1k # 查找小于1KB的文件
find /path -mtime -7 # 7天内修改的文件
find /path -mtime +30 # 30天前修改的文件
find /path -user username # 按所有者查找
find /path -perm 644 # 按权限查找
find /path -name "*.log" -delete # 查找并删除
find /path -name "*.txt" -exec rm {} \; # 执行命令
find /path -name "*.txt" -exec cp {} /backup/ \; # 复制匹配文件
find /path \( -name "*.tmp" -o -name "*.log" \) -delete # 或条件
locate filename # 快速查找文件
locate "*.txt" # 查找所有txt文件
locate -i filename # 忽略大小写
locate -n 10 filename # 限制结果数量
locate -r "\.conf$" # 正则表达式查找
sudo updatedb # 更新数据库
注意: locate 使用预建的数据库,比 find 快但需要定期更新(通常由cron自动完成)。
which command # 查找命令的可执行文件路径
which -a command # 查找所有匹配路径
whereis command # 查找命令的二进制、源码和man页
whereis -b command # 只查找二进制文件
type command # 显示命令类型
type -a command # 显示所有匹配
type -t command # 只显示类型(alias、builtin、file等)
# 定义变量
name="value"
num=100
# 使用变量
echo $name
echo ${name}
echo "Hello, $name"
# 只读变量
readonly PI=3.14159
# 删除变量
unset name
# 环境变量
export PATH=$PATH:/new/path
export MY_VAR="value"
# 特殊变量
$0 # 脚本名
$1, $2, ... # 位置参数
$# # 参数个数
$* # 所有参数(作为一个字符串)
$@ # 所有参数(作为多个字符串)
$? # 上一个命令的退出状态
$$ # 当前进程ID
# 文件测试
[ -e file ] # 文件存在
[ -f file ] # 是普通文件
[ -d dir ] # 是目录
[ -r file ] # 可读
[ -w file ] # 可写
[ -x file ] # 可执行
[ -s file ] # 文件大小非零
[ -L file ] # 是符号链接
# 字符串比较
[ "$a" = "$b" ] # 相等
[ "$a" != "$b" ] # 不等
[ -z "$a" ] # 长度为0
[ -n "$a" ] # 长度非0
[ "$a" ] # 非空
# 数值比较
[ $a -eq $b ] # 等于
[ $a -ne $b ] # 不等于
[ $a -gt $b ] # 大于
[ $a -ge $b ] # 大于等于
[ $a -lt $b ] # 小于
[ $a -le $b ] # 小于等于
# 逻辑运算
[ $a -eq 1 ] [ $b -eq 2 ] # AND
[ $a -eq 1 ] [ $b -eq 2 ] # OR
! [ $a -eq 1 ] # NOT
# if语句
if [ condition ]; then
# commands
elif [ condition ]; then
# commands
else
# commands
fi
# for循环
for i in 1 2 3 4 5; do
echo $i
done
for file in *.txt; do
echo $file
done
for ((i=0; i<10; i++)); do
echo $i
done
# while循环
while [ condition ]; do
# commands
done
while read line; do
echo $line
done < file.txt
# until循环
until [ condition ]; do
# commands
done
# case语句
case $var in
pattern1)
# commands
;;
pattern2|pattern3)
# commands
;;
*)
# default
;;
esac
# 定义函数
function_name() {
# commands
return 0
}
function_name() {
local var="local value" # 局部变量
echo "Parameter 1: $1"
echo "Parameter 2: $2"
return 0
}
# 调用函数
function_name arg1 arg2
result=$(function_name arg1) # 捕获输出
command > file # 标准输出重定向到文件(覆盖)
command >> file # 标准输出追加到文件
command 2> file # 标准错误重定向到文件
command 2>1 # 标准错误重定向到标准输出
command > file # 标准输出和错误都重定向到文件
command < file # 从文件读取标准输入
command << EOF # Here document
command <<< "string" # Here string
command command # 管道
command > /dev/null # 丢弃输出
command 2>1 > /dev/null # 只保留错误输出
# 光标移动
Ctrl+A # 移到行首
Ctrl+E # 移到行尾
Ctrl+F # 向前移动一个字符(同→)
Ctrl+B # 向后移动一个字符(同←)
Alt+F # 向前移动一个单词
Alt+B # 向后移动一个单词
# 编辑
Ctrl+D # 删除当前字符
Ctrl+H # 删除前一个字符(同Backspace)
Ctrl+W # 删除前一个单词
Alt+D # 删除后一个单词
Ctrl+U # 删除从光标到行首
Ctrl+K # 删除从光标到行尾
Ctrl+Y # 粘贴删除的内容
Ctrl+T # 交换当前和前一个字符
Alt+T # 交换当前和前一个单词
# 历史
Ctrl+P # 上一条命令(同↑)
Ctrl+N # 下一条命令(同↓
Ctrl+R # 反向搜索历史
Ctrl+G # 取消搜索
!! # 执行上一条命令
!n # 执行历史第n条命令
!-n # 执行倒数第n条命令
!string # 执行最近以string开头的命令
!$ # 上一条命令的最后一个参数
!* # 上一条命令的所有参数
# 查找并删除大文件
find /var/log -type f -size +100M -exec ls -lh {} \;
# 统计当前目录下各子目录大小
du -h --max-depth=1 | sort -hr
# 查找并替换文件内容
find . -type f -name "*.txt" -exec sed -i 's/old/new/g' {} \;
# 批量重命名
for f in *.txt; do mv "$f" "${f%.txt}.bak"; done
# 监控日志并过滤
tail -f /var/log/syslog | grep "error"
# 生成随机密码
date +%s | sha256sum | base64 | head -c 32 ; echo
openssl rand -base64 32
# 测试网站响应时间
curl -o /dev/null -s -w "%{time_total}\n" https://example.com
# 查看最占用内存的进程
ps aux --sort=-%mem | head -11
# 查看端口占用
netstat -tulpn | grep :80
# 清空文件内容
> file.txt
truncate -s 0 file.txt
# 创建指定大小的空文件
dd if=/dev/zero of=file.bin bs=1M count=100
fallocate -l 100M file.bin
truncate -s 100M file.bin
# 生成序列
seq 1 100
seq 1 2 100 # 步长为2
echo {1..100}
echo {a..z}
# 并行执行
for i in {1..10}; do (sleep 1; echo $i) done; wait
# 使用更快的工具替代
grep → rg (ripgrep)
find → fd
ls → exa
cat → bat
du → dust
# 避免不必要的cat
cat file grep pattern # 低效
grep pattern file # 高效
# 使用内置命令代替外部程序
# $() 比 `` 更好(可嵌套)
result=$(command)
# 批量处理减少fork
# 低效:多次调用外部命令
for f in *.txt; do wc -l "$f"; done
# 高效:一次处理
wc -l *.txt
# 1. 使用绝对路径
/usr/bin/rm file # 比 rm file 更安全
# 2. 变量引用加引号
file="my file.txt"
rm "$file" # 正确
rm $file # 错误(会被解析为两个参数)
# 3. 使用set -e让脚本遇错即停
set -e
# 4. 使用set -u检测未定义变量
set -u
# 5. 使用set -o pipefail检测管道错误
set -o pipefail
# 6. 清理临时文件
tmpfile=$(mktemp)
trap "rm -f $tmpfile" EXIT
# 7. 避免eval
eval "$user_input" # 危险!
# 8. 检查命令返回值
if ! command; then
echo "Command failed"
exit 1
fi
# 启用调试模式
bash -x script.sh # 执行时显示每条命令
set -x # 在脚本中启用调试
set +x # 关闭调试
# 详细输出
bash -v script.sh # 显示输入行
# 结合使用
bash -xv script.sh
# 部分调试
set -x
# 需要调试的代码
set +x
# 使用PS4自定义调试前缀
export PS4='+ ${BASH_SOURCE}:${LINENO}:${FUNCNAME[0]:+${FUNCNAME[0]}(): }'
Shell命令是Linux系统管理的基石。掌握这些命令不仅能提高日常工作效率,还能为自动化运维和DevOps实践打下坚实基础。
学习建议:
man command)深入了解推荐资源:
man bash - Bash完整手册本文档持续更新,建议收藏备用。