1. Shell指令速查的必要性与使用场景
作为一名常年与Linux服务器打交道的工程师,我深刻体会到Shell指令就像外科医生的手术刀——看似简单,但每一把都有其特定用途。新手工程师最常犯的错误就是花大量时间在搜索引擎里反复查找同一个基础命令,而资深工程师的终端历史记录里往往藏着上百个精心打磨的alias和函数。
为什么需要速查手册?当服务器CPU飙到95%时,你需要立即用top -H -p $(pgrep -d, nginx)定位线程,而不是去查文档;当磁盘爆满时,得快速组合du -h --max-depth=1 / | sort -hr找出罪魁祸首。这些场景下,肌肉记忆比任何文档都可靠。
典型使用场景分类:
- 故障排查:
dmesg -T | grep -i error(带时间戳查内核错误) - 性能分析:
sar -u 1 3(每1秒采样CPU,共3次) - 批量处理:
find . -name "*.log" -mtime +30 -exec rm {} \;(删除30天前的日志) - 数据提取:
awk -F',' '{sum+=$3} END {print sum}' data.csv(CSV第三列求和)
提示:建议将本文中的命令保存到
~/.bash_aliases,例如alias memhog='ps -eo pid,comm,%mem --sort=-%mem | head -n 6',下次查内存占用直接输memhog
2. 文件系统操作:从基础到高阶
2.1 核心文件操作指令
cp和mv可能是最常用的指令,但隐藏技巧很多:
# 保留权限拷贝(适合备份) cp -a /source/folder /backup/ # 交互式覆盖确认 cp -i source.txt destination/ # 显示详细操作过程 mv -v *.jpg /images/rsync的进阶用法:
# 增量备份(排除临时文件) rsync -azh --progress --exclude='*.tmp' /data/ user@backup:/backups/ # 断点续传 rsync --partial --append-verify -e 'ssh -p 2222' largefile user@host:/path/2.2 查找与统计实战
find命令的复杂查询示例:
# 找7天内修改过的php文件(忽略大小写) find /var/www/ -type f -name "*.php" -mtime -7 -iname "*config*" # 批量修改权限(配合xargs) find . -name "*.sh" -print0 | xargs -0 chmod 750磁盘空间分析黄金组合:
# 可视化显示目录大小(需要安装ncdu) ncdu /var/log/ # 快速查看挂载点使用率 df -hT | grep -v tmpfs # 找出大于100MB的文件 find / -type f -size +100M -exec ls -lh {} \; 2>/dev/null3. 文本处理三剑客:grep/awk/sed
3.1 grep的精准匹配技巧
# 显示匹配行及前后3行(查日志上下文) grep -A3 -B3 "ERROR" app.log # 只显示匹配部分(提取特定字段) grep -oP 'user_id:\K\d+' access.log # 排除注释和空行 grep -vE '^\s*(#|$)' config.ini性能对比:
grep:简单模式匹配最快ack:专为代码搜索优化ag(The Silver Searcher):超快递归搜索rg(ripgrep):当前性能冠军
3.2 awk数据处理实战
统计Nginx访问日志示例:
# 统计各状态码出现次数 awk '{status[$9]++} END {for(s in status) print s, status[s]}' access.log # 计算接口平均响应时间(第4列为时间) awk '/api\/user/ {sum+=$4; count++} END {print "Avg:", sum/count,"ms"}' api.log字段处理技巧:
# 提取第二列并去重 awk -F',' '{print $2}' data.csv | sort -u # 条件格式化输出 awk '{printf "%-20s %10.2f\n", $1, $3/$2}' ratios.txt3.3 sed的流编辑魔法
# 替换文件中的字符串(直接修改源文件) sed -i.bak 's/old/new/g' file.txt # 删除10-20行 sed -i '10,20d' config.conf # 在匹配行后插入 sed -i '/pattern/a\inserted line' file高级模式示例:
# 转换日期格式(MM/DD/YYYY → YYYY-MM-DD) sed -E 's#([0-9]{2})/([0-9]{2})/([0-9]{4})#\3-\1-\2#g' dates.txt # 提取两个标记之间的内容 sed -n '/<start>/,/<end>/p' data.xml4. 系统监控与性能分析
4.1 实时监控指令集
CPU监控三板斧:
# 按CPU使用率排序 top -o %CPU # 显示每个核的利用率 mpstat -P ALL 1 # 进程级监控(需要安装htop) htop --tree --sort-key=PERCENT_CPU内存分析黄金命令:
# 显示内存占用排序 ps -eo pid,comm,%mem --sort=-%mem | head # 详细内存报告(需要安装smem) smem -r -k -c "pss uss rss" # 检测内存泄漏(观察RSS增长) watch -n1 'ps -p $(pgrep myapp) -o rss='4.2 网络与IO分析
网络连接分析:
# 查看ESTABLISHED连接数 ss -s | grep ESTAB # 显示TCP连接状态统计 netstat -ant | awk '{print $6}' | sort | uniq -c # 找出占用带宽的进程(需要安装nethogs) sudo nethogs eth0磁盘IO监控:
# 查看磁盘实时负载(需要安装iotop) sudo iotop -oPa # 统计各进程IO(需内核支持) pidstat -d 1 # 测量实际磁盘速度 dd if=/dev/zero of=./testfile bs=1G count=1 oflag=direct5. 进程管理与系统调试
5.1 进程控制高级技巧
# 优雅停止进程(发送SIGTERM) pkill -TERM -f "python3 app.py" # 强制杀死(当进程无响应时) kill -9 $(pgrep -f "stuck_process") # 查看进程树结构 pstree -apnh $(pgrep nginx)后台作业管理:
# 启动后台作业(带日志输出) nohup ./long_task.sh > task.log 2>&1 & # 断开SSH保持运行(使用tmux) tmux new -s long_task ./run.sh Ctrl+b d # 分离会话5.2 系统调试与信息收集
内核参数检查:
# 查看打开文件数限制 ulimit -n # 显示系统关键参数 sysctl -a | grep -E 'vm.swappiness|fs.file-max'崩溃分析工具链:
# 生成core dump(需提前配置ulimit) ulimit -c unlimited ./buggy_app gdb ./buggy_app core # 跟踪系统调用 strace -ff -o trace.log ./program6. Shell脚本编程实战技巧
6.1 健壮性设计原则
错误处理最佳实践:
#!/bin/bash set -euo pipefail # 开启严格模式 trap "echo '脚本被中断!'; exit 1" INT TERM log_file="/var/log/myscript.log" exec > >(tee -a "$log_file") 2>&1 # 同时输出到终端和日志 # 检查依赖 command -v jq >/dev/null || { echo "需要安装jq"; exit 1; }参数解析模板:
while getopts ":a:b:v" opt; do case $opt in a) arg_a="$OPTARG" ;; b) arg_b="$OPTARG" ;; v) verbose=true ;; \?) echo "无效选项: -$OPTARG" >&2; exit 1 ;; esac done [[ -z "$arg_a" ]] && { echo "必须提供-a参数"; exit 1; }6.2 性能优化技巧
避免常见性能陷阱:
# 错误示例:循环中频繁调用外部命令 for file in *; do size=$(du -h "$file") # 每次循环都启动新进程 done # 正确做法:使用shell内置功能 files=(*) sizes=($(du -h "${files[@]}")) # 批量处理并行处理加速:
# 使用xargs并行(4个进程) find . -name "*.jpg" | xargs -P4 -I{} convert {} -resize 800x600 {}.thumb # GNU parallel高级用法 parallel -j 4 --progress "python process.py {}" ::: input_*.txt7. 安全相关操作与审计
7.1 用户与权限管理
# 批量创建用户(带随机密码) for user in dev1 dev2 dev3; do pass=$(openssl rand -base64 12) useradd -m -s /bin/bash "$user" echo "$user:$pass" | chpasswd echo "Created $user with pass $pass" done # 检查SUID文件(潜在风险) find / -type f -perm -4000 -exec ls -ld {} \; 2>/dev/null7.2 日志审计与分析
SSH登录失败监控:
# 统计失败尝试 grep "Failed password" /var/log/auth.log | awk '{print $11}' | sort | uniq -c | sort -nr # 实时监控登录尝试 tail -f /var/log/auth.log | grep --line-buffered "sshd"文件完整性检查:
# 生成基线哈希 find /etc -type f -exec sha256sum {} \; > /var/log/etc_hashes.txt # 后续检查差异 find /etc -type f -exec sha256sum {} \; | diff -u /var/log/etc_hashes.txt -8. 开发环境高效工作流
8.1 终端增强配置
~/.bashrc实用片段:
# 智能补全忽略大小写 bind 'set completion-ignore-case on' # 历史命令增强 export HISTCONTROL=ignoreboth:erasedups export HISTSIZE=10000 shopt -s histappend # 快速目录跳转 alias ..='cd ..' alias ...='cd ../..' alias ....='cd ../../..' # 带颜色的grep alias grep='grep --color=auto'8.2 开发辅助工具链
代码统计示例:
# 统计项目代码行数(排除空行和注释) find src/ -name "*.py" -exec cat {} \; | grep -vE '^\s*(#|$)' | wc -l # 查看git贡献者排名 git shortlog -sn --no-mergesAPI测试快捷命令:
# 快速测试REST API alias testapi='http --verbose --json POST http://api.example.com/v1/resource \ Authorization:"Bearer $TOKEN" param1=value1 param2=value2' # 监控API响应时间 watch -n1 'curl -o /dev/null -s -w "%{time_total}s\n" http://api.example.com/ping'