刚接触Linux时,面对黑底白字的终端窗口,很多新手都会感到无从下手。我在2008年第一次使用Ubuntu时,连怎么查看当前目录都要Google。经过15年的运维工作积累,我总结出一条高效的学习路径:
重要提示:不要试图一次性记住所有命令参数,实际工作中90%的场景只需要掌握每个命令的3-5个常用参数即可。
bash复制# 查看当前路径(比pwd更直观的替代方案)
$ echo $PWD
/home/user/projects
# 带颜色显示并区分文件类型(F=目录,@=链接,*=可执行)
$ ls -F --color=auto
Documents/ Downloads/ script.sh* symlink@
# 递归查看子目录并显示文件大小(human-readable)
$ ls -lhR
避坑经验:
ls -l可能导致终端卡顿,此时应该用ls -1 | wc -l先统计文件数量ls --time-style='+%Y-%m-%d %H:%M:%S'可以统一时间显示格式bash复制# 复制时保留所有属性并显示进度(适合大文件)
$ cp -av --progress source_file destination
# 安全删除(先echo确认目标文件)
$ echo rm -i *.log
rm -i access.log error.log
# 查找并批量修改权限(比chmod -R更安全)
$ find . -type f -name "*.sh" -exec chmod 750 {} \;
文件校验场景:
bash复制# 生成校验码(不同算法对比)
$ md5sum large_file.iso
$ sha256sum large_file.iso
# 快速比较两个目录差异
$ diff -qr dir1/ dir2/
bash复制# 显示匹配行及前后3行上下文(关键日志排查)
$ grep -A3 -B3 "error" /var/log/syslog
# 递归搜索时排除特定目录(忽略.git和node_modules)
$ grep -r --exclude-dir={.git,node_modules} "TODO" .
# 使用PCRE正则(支持更复杂的模式)
$ grep -P '\d{3}-\d{4}' contacts.txt
bash复制# 就地修改文件(备份原文件为.bak)
$ sed -i.bak 's/old/new/g' file.txt
# 只修改匹配特定模式的行
$ sed '/^#/!s/foo/bar/' config.cfg
# 提取两个标记之间的内容(提取HTML片段)
$ sed -n '/<div id="content">/,/<\/div>/p' page.html
bash复制# 统计nginx日志中各状态码出现次数
$ awk '{status[$9]++} END {for(s in status) print s, status[s]}' access.log
# 计算CSV文件第三列平均值(跳过标题行)
$ awk -F, 'NR>1 {sum+=$3} END {print sum/(NR-1)}' data.csv
# 格式化输出(类似表格效果)
$ awk '{printf "%-20s %10.2f\n", $1, $2}' sales.txt
bash复制# 动态刷新版top(按内存排序)
$ top -o %MEM
# 磁盘IO监控(每2秒刷新)
$ iostat -x 2
# 网络流量统计(按进程展示)
$ nethogs
sar**工具是系统管理员的最佳伙伴:复制```bash
# 查看过去24小时的CPU使用率
$ sar -u -f /var/log/sa/sa$(date +%d -d yesterday)
# 生成内存使用报告(CSV格式)
$ sar -r | awk 'NR>3 {print $1","$5}' > mem_usage.csv
性能瓶颈定位流程:
top确认高负载进程strace -p PID分析系统调用perf stat进行性能剖析vmstat 1观察上下文切换情况bash复制# 带时间戳的持续ping(记录网络波动)
$ ping -D 8.8.8.8 | while read pong; do echo "$(date): $pong"; done
# 追踪路由并显示AS编号
$ mtr --aslookup example.com
# 测试端口连通性(5秒超时)
$ nc -zv -w5 192.168.1.1 22
bash复制# 生成ED25519密钥对(比RSA更安全)
$ ssh-keygen -t ed25519 -C "work@server"
# 强制使用密钥登录(禁用密码)
$ sudo sed -i 's/#PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config
# 多因素认证配置(Google Authenticator)
$ sudo apt install libpam-google-authenticator
$ google-authenticator
bash复制# 每月1号凌晨压缩日志(添加错误重定向)
0 0 1 * * /usr/bin/find /var/log -name "*.log" -exec gzip {} \; > /tmp/log_zip.log 2>&1
# 每小时检查磁盘空间(超过90%报警)
0 * * * * [ $(df / | awk 'NR==2{print $5}' | tr -d '%') -gt 90 ] && wall "Disk space critical!"
bash复制#!/bin/bash
set -euo pipefail # 严格模式:错误退出、未定义变量检测、管道错误检测
# 带超时的命令执行(60秒超时)
if ! output=$(timeout 60s some_command); then
echo "Command timed out" >&2
exit 1
fi
# 安全的临时文件创建
tempfile=$(mktemp /tmp/backup.XXXXXXXXXX)
trap 'rm -f "$tempfile"' EXIT # 退出时自动清理
参数处理模板:
bash复制while getopts ":a:b:" opt; do
case $opt in
a) arg1="$OPTARG" ;;
b) arg2="$OPTARG" ;;
\?) echo "Invalid option: -$OPTARG" >&2 ;;
esac
done
shift $((OPTIND-1))
bash复制# 查看容器资源占用(比docker stats更详细)
$ podman stats --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}"
# 构建时跳过缓存(确保获取最新依赖)
$ docker build --no-cache -t myapp .
# 清理无用镜像(空间回收利器)
$ docker image prune -a --filter "until=24h"
bash复制# 动态查看Pod日志(多容器场景)
$ kubectl logs -f deployment/myapp --all-containers=true
# 快速进入调试容器(临时busybox)
$ kubectl debug -it pod/mypod --image=busybox -- sh
# 资源使用排行(按CPU排序)
$ kubectl top pods --sort-by=cpu -A
bash复制# 忽略特定命令(避免敏感命令留痕)
export HISTIGNORE="*secret*:sudo *"
# 时间戳记录(审计必备)
export HISTTIMEFORMAT="%F %T "
# 快速重复历史命令(!$=上条命令最后一个参数)
$ mkdir /backup/data
$ cd !$
bash复制# tmux会话持久化(断网不中断)
$ tmux new -s work
$ tmux detach # 按Ctrl+b d
$ tmux attach -t work
# 分屏工作流(垂直分割+SSH连接)
$ tmux split-window -h
$ tmux send-keys "ssh user@server" C-m
bash复制# 查看启动耗时(找出拖慢的服务)
$ systemd-analyze blame
# 救援模式挂载根目录
$ mount -o remount,rw /
$ fsck /dev/sda1
bash复制# 找出磁盘IO高的进程
$ iotop -oP
# 检查内存泄漏(观察RSS增长)
$ watch -n1 'ps -eo pid,rss,comm | grep myapp'
# 跟踪系统调用(定位卡顿原因)
$ strace -ttT -p $(pgrep myapp)
| 传统命令 | 现代替代 | 优势 |
|---|---|---|
| ifconfig | ip addr | 更详细的网络信息 |
| netstat | ss | 更快的连接查询 |
| top | htop | 交互式进程管理 |
| find | fd | 更快的搜索速度 |
| grep | rg (ripgrep) | 多线程加速 |
在多年的运维工作中,我发现最有效的学习方式是在实际场景中应用这些命令。建议读者建立一个自己的"命令手册",记录每个解决特定问题的命令组合。比如我有个专门处理日志分析的笔记,里面记录了十几种grep/sed/awk的组合用法,这比死记硬背参数要实用得多。