文件操作
查找文件
# 按名称查找文件
find /path/to/search -name "filename"
# 按类型查找(f=文件,d=目录)
find /path/to/search -type f -name "*.txt"
# 查找并删除
find /path/to/search -name "*.log" -delete
# 使用 fd(更快的替代品)
fd "pattern" /path/to/search
批量重命名
# 批量添加前缀
for file in *.txt; do mv "$file" "prefix_$file"; done
# 批量替换扩展名
for file in *.txt; do mv "$file" "${file%.txt}.md"; done
# 使用 rename 命令
rename 's/old/new/' *.txt
文件权限
# 修改文件权限
chmod 755 script.sh
# 递归修改目录权限
chmod -R 644 /path/to/dir
# 修改所有者
chown user:group file.txt
文本处理
heredoc
https://linuxize.com/post/bash-heredoc/
heredoc用于直接在命令行输入多行文本,并将其输入给命令
# 一般形式
[COMMAND] <<[-] 'DELIMITER'
HERE-DOCUMENT
DELIMITER
# 直接在终端将多行文本输出到文件
cat <<EOF > ~/kustomization.yaml
line 1
line 2
EOF
# 直接在终端将多行文本输出到文件(禁止变量替换,原样输出)
cat <<'EOF' > ~/kustomization.yaml
line 1
$HOME
line 3
EOF
# 使用 <<- 以忽略heredoc的tab缩进,便于在判断或者循环代码块中使用
if true; then
cat <<- EOF
Line with a leading tab.
EOF
fi
grep 搜索
# 基本搜索
grep "pattern" file.txt
# 递归搜索目录
grep -r "pattern" /path/to/dir
# 忽略大小写
grep -i "pattern" file.txt
# 显示行号
grep -n "pattern" file.txt
# 反向匹配(不包含)
grep -v "pattern" file.txt
# 使用正则表达式
grep -E "pattern1|pattern2" file.txt
sed 文本替换
# 替换第一个匹配
sed 's/old/new/' file.txt
# 替换所有匹配
sed 's/old/new/g' file.txt
# 直接修改文件
sed -i 's/old/new/g' file.txt
# 删除包含特定模式的行
sed '/pattern/d' file.txt
# 在特定行后插入内容
sed '3a\new line' file.txt
awk 文本处理
# 打印特定列
awk '{print $1, $3}' file.txt
# 使用分隔符
awk -F',' '{print $1}' file.csv
# 条件过滤
awk '$3 > 100 {print $1}' file.txt
# 计算总和
awk '{sum += $1} END {print sum}' file.txt
系统管理
进程管理
# 查看进程
ps aux | grep process_name
# 实时监控进程
top
htop
# 杀死进程
kill PID
kill -9 PID # 强制杀死
# 按名称杀死进程
pkill process_name
killall process_name
磁盘管理
# 查看磁盘使用情况
df -h
# 查看目录大小
du -sh /path/to/dir
# 查看当前目录下各子目录大小
du -h --max-depth=1
# 查找大文件
find / -type f -size +100M
网络操作
# 查看网络连接
netstat -tuln
ss -tuln
# 测试端口
nc -zv host port
telnet host port
# 下载文件
wget URL
curl -O URL
# 查看本机 IP
ip addr show
ifconfig
Git
压缩解压
tar
# 压缩
tar -czf archive.tar.gz /path/to/dir
# 解压
tar -xzf archive.tar.gz
# 查看压缩包内容
tar -tzf archive.tar.gz
# 解压到指定目录
tar -xzf archive.tar.gz -C /path/to/extract
zip
# 压缩文件
zip archive.zip file1 file2
# 压缩目录
zip -r archive.zip /path/to/dir
# 解压
unzip archive.zip
# 解压到指定目录
unzip archive.zip -d /path/to/extract
实用技巧
快捷键
# Ctrl+C: 终止当前命令
# Ctrl+Z: 暂停当前命令
# Ctrl+D: 退出当前 shell
# Ctrl+L: 清屏
# Ctrl+A: 光标移到行首
# Ctrl+E: 光标移到行尾
# Ctrl+U: 删除光标前的内容
# Ctrl+K: 删除光标后的内容
# Ctrl+R: 搜索历史命令
进程替换
进程替换允许你把一个命令的输出或输入当作文件来使用,语法如下:
<(command) # 把命令的输出当作一个只读文件
>(command) # 把命令的输入当作一个只写文件
有趣的例子:
# <(ls /etc) 会生成一个临时的伪文件,比如 /dev/fd/63;
# <(ls /bin) 会生成另一个,比如 /dev/fd/62;
# 然后 diff 命令读取这两个“文件”并进行比较。
# 这样 diff 就能比较两个命令的输出,而不需要先写入临时文件。
diff <(ls /etc) <(ls /bin)
# 将目录下所有日志文件的路径,保存到数组变量中
# 通过管道操作符会有问题,比如
# command | mapfile ARR
# 管道的右侧是一个新的shell进程,因此ARR存在于新进程中,命令结束后,ARR在本shell进程找不到
mapfile ARR < <(find -type f -name "*.log")
# 边下载边计算校验值
curl -L https://example.com/file.tar.gz | tee >(sha256sum > checksum.txt) > file.tar.gz
# 主输出同时写入:
# grep error → errors.txt,将error日志写入error.txt
# grep warn → warnings.txt,将warn日志写入warnings.txt
# 以及 all.txt,将所有日志写入all.txt
# 非常适合日志分流。
tee >(grep error > errors.txt) >(grep warn > warnings.txt) > all.txt
Docker 相关
容器管理
# 列出容器
docker ps
docker ps -a # 包括已停止的
# 启动/停止容器
docker start container_id
docker stop container_id
# 删除容器
docker rm container_id
# 进入容器
docker exec -it container_id /bin/bash
# 查看日志
docker logs container_id
镜像管理
# 列出镜像
docker images
# 拉取镜像
docker pull image_name:tag
# 删除镜像
docker rmi image_id
# 构建镜像
docker build -t image_name:tag .
# 清理未使用的镜像
docker image prune
性能分析
系统监控
# CPU 使用率
top
htop
# 内存使用
free -h
# IO 监控
iostat
iotop
# 网络流量
iftop
nethogs
日志分析
# 实时查看日志
tail -f /var/log/syslog
# 查看最后 N 行
tail -n 100 /var/log/syslog
# 搜索日志中的错误
grep -i error /var/log/syslog
# 统计日志中的出现次数
grep "pattern" /var/log/syslog | wc -l