简介:这是一份面向Linux初学者与运维入门者的常用命令速查手册,以PDF形式系统梳理了日常操作中高频使用的命令体系,帮助读者快速建立命令分类认知、摆脱边用边查的低效状态。资源共1个PDF文件,压缩包约796KB,内容按目录操作、文件操作、文件内容查看、系统日志、软连接、压缩解压、文件权限、Docker容器、运维排查、内核优化、用户权限等十余个模块组织,涵盖mkdir、cd、rm、cp、mv、find、vim、tar、chmod、docker、netstat、yum、top、ps、useradd、sysctl等命令的典型用法与参数示例,并附有split拆分文件、more与less差异对比等实用细节。目前已有6165人学习下载,适合作为日常查阅的案头参考,也可用于面试前快速回顾命令要点,帮助读者在服务器管理、日志排查与容器运维场景中提升操作效率。
1. 从一份被反复收藏的命令清单说起
很多人第一次接触 Linux,不是从装系统开始的,而是从「连上服务器之后不知道敲什么」开始的。那份被收藏了一万多次的《10分钟让你掌握Linux常用命令》PDF,本质上解决的就是这个场景:你拿到一台机器,没有图形界面,只有一行闪烁的光标,接下来要做的所有事——看目录、找文件、改配置、查日志、传数据——都得靠命令完成。它不教你内核调度,也不讲文件系统实现,它只回答一个问题:日常运维和开发中,哪些命令是绕不开的,它们怎么组合起来干活。
这篇文章面向两类人:一类是刚接触 Linux、能看懂ls但一遇到grep加管道就发怵的新手;另一类是用过几年 Linux、但命令全靠零散搜索、想系统梳理一遍边界的熟手。我会把这份清单背后的逻辑拆开,告诉你每条命令为什么存在、参数怎么设、组合起来能解决什么真实问题,以及那些只有踩过才知道的坑。10 分钟掌握是夸张说法,但 10 分钟建立起「遇到问题知道该查哪类命令」的直觉,是可行的。
2. 文件与目录:一切操作的起点
Linux 里所有东西都是文件,所以文件与目录操作是使用频率最高的一类命令。这一章不讲ls有几种颜色,而是讲清楚「怎么快速定位、查看、批量处理文件」,这是后面所有操作的基础。
2.1 查看与切换:ls、cd、pwd 的高频参数
ls最常用的三个参数是-l(长格式)、-a(显示隐藏文件)、-h(人类可读大小)。单独用ls只能看到文件名,加上-lh才能看到权限、属主、大小和修改时间。-a会显示以.开头的隐藏文件,比如.bashrc、.gitignore,这些文件在排查环境问题时经常是关键。
# 查看当前目录下所有文件,含隐藏文件,长格式,大小可读 ls -lah # 只看最近修改的 5 个文件,按时间倒序 ls -lt | head -n 5 # 递归查看目录结构,但排除 node_modules 和 .git ls -R | grep -v -E "node_modules|\.git"ls -lt按修改时间排序,head -n 5取前五行,这是快速确认「最近谁动过这个目录」的常用组合。grep -v是反向过滤,排除掉不关心的目录。注意ls -R在大型项目里输出会非常长,通常用tree -L 2替代,但tree不是所有系统都预装。
cd的坑在于cd -可以回到上一个目录,cd ~回 home,cd ..回上级。很多人不知道cd -,在兩個目录之间来回切换时反复敲长路径。pwd看似简单,但在符号链接目录里,pwd显示的是逻辑路径,pwd -P显示物理路径,写脚本时要注意这个区别。
2.2 查找与批量处理:find、xargs、通配符
find是文件查找的重型工具,按名称、时间、大小、权限都能查。最常用的场景是「找出 7 天前的日志文件并删除」或者「找出所有 .log 文件并统计行数」。
# 查找当前目录下 7 天前修改过的 .log 文件 find . -name "*.log" -mtime +7 # 找出大于 100M 的文件,按大小排序 find /var -type f -size +100M -exec ls -lh {} \; | sort -k5 -rh # 删除 30 天前的日志文件,删除前先确认 find /var/log -name "*.log" -mtime +30 -print find /var/log -name "*.log" -mtime +30 -delete-mtime +7表示修改时间在 7 天以前,-mtime -7是 7 天以内。-exec后面跟命令,{}代表找到的文件,\;是结束符。-delete比-exec rm {} \;更安全,因为它要求-delete必须是最后一个参数,减少误删风险。血泪经验:执行-delete之前,一定先用-print跑一遍,确认输出列表是对的,再换成-delete。
xargs常和find搭配,把找到的文件名传给下一个命令。find . -name "*.tmp" | xargs rm -f和find . -name "*.tmp" -exec rm -f {} +效果类似,但xargs在文件名含空格时会出问题,需要-print0和xargs -0配合。
# 安全处理含空格的文件名 find . -name "*.tmp" -print0 | xargs -0 rm -f通配符*匹配任意字符,?匹配单个字符,[abc]匹配括号内任一字符。注意*在 shell 里先展开再传给命令,如果匹配的文件太多会报「参数列表过长」,这时要用find或xargs。
3. 文本处理三剑客:grep、sed、awk 的实战组合
文件找到之后,下一步是看内容、改内容、抽内容。grep、sed、awk被称为文本处理三剑客,单独用都不难,难的是组合起来解决实际问题。这一章按「查、改、抽」三个动作拆开讲。
3.1 grep:从日志里捞出关键行
grep的核心是模式匹配。最常用的参数:-i忽略大小写,-r递归目录,-n显示行号,-v反向匹配,-C 3显示匹配行前后各 3 行上下文。
# 在日志里找 ERROR,显示行号和前后 2 行 grep -n -C 2 "ERROR" app.log # 递归搜索代码里的 TODO,排除 node_modules grep -rn "TODO" ./src --exclude-dir=node_modules # 统计每个 IP 出现的次数,取前 10 grep -oE "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+" access.log | sort | uniq -c | sort -rn | head -n 10最后一条是日志分析的经典管道:grep -oE只输出匹配的部分,sort排序,uniq -c统计连续重复行次数,sort -rn按数字倒序,head取前 10。注意uniq -c只能统计相邻重复行,所以必须先sort。
grep的坑在于正则表达式默认是基本正则(BRE),+、?、|需要转义或用-E开启扩展正则。另外grep -r遇到二进制文件会输出「Binary file matches」,加-I可以忽略二进制文件。
3.2 sed:批量替换与行级编辑
sed最常用的是替换:sed 's/old/new/g' file。s表示替换,g表示全局,不加g只替换每行第一个匹配。
# 把配置文件里的 8080 改成 9090,先备份原文件 sed -i.bak 's/8080/9090/g' config.conf # 删除空行和注释行 sed -i '/^$/d; /^#/d' config.conf # 在第 5 行后插入一行 sed -i '5a\new line content' file.txt-i是原地修改,-i.bak会先备份成config.conf.bak。注意:sed -i在 macOS 和 Linux 上行为不同,macOS 要求-i后面必须跟备份后缀,写成-i ''才是不备份。跨平台脚本里建议用sed -i.bak再手动删备份,或者用perl -pi -e替代。
sed的地址定位很灵活:1,5d删除 1 到 5 行,/pattern/d删除匹配行,$d删除最后一行。组合起来可以写很复杂的编辑逻辑,但可读性会下降,复杂场景建议用awk或脚本语言。
3.3 awk:按列抽取与统计
awk适合处理结构化文本,比如 CSV、日志、命令输出。默认按空格或 Tab 分列,$1是第一列,$0是整行,NF是列数,NR是行号。
# 打印第 1 列和第 3 列 awk '{print $1, $3}' data.txt # 统计第 2 列的总和 awk '{sum += $2} END {print sum}' data.txt # 按第 1 列分组,统计每组第 2 列的平均值 awk '{sum[$1] += $2; count[$1]++} END {for (k in sum) print k, sum[k]/count[k]}' data.txt # 过滤第 3 列大于 100 的行 awk '$3 > 100 {print $0}' data.txtawk的-F参数指定分隔符,处理 CSV 时用-F,。BEGIN块在读取文件前执行,END块在读取后执行,中间块对每一行执行。上面第三条是分组统计的模板,sum[$1]是以第一列值为键的数组,for (k in sum)遍历数组。
awk的坑在于默认分隔符是连续空格或 Tab,如果字段之间是单个空格但字段内容也含空格,分列会出错。这时要明确指定-F'\t'或-F,。另外awk的数值比较是浮点比较,整数比较建议用int($3) > 100。
4. 权限与进程:让命令跑得起来、停得下来
命令会用了,接下来要解决「为什么执行不了」和「怎么管住跑起来的程序」。权限和进程管理是日常运维里最容易翻车的两块,这一章把常见场景和排查方法讲清楚。
4.1 权限模型:chmod、chown、umask
Linux 权限分三组:属主(u)、属组(g)、其他(o),每组有读(r=4)、写(w=2)、执行(x=1)。chmod 755 file表示属主读写执行、属组和其他读执行。chmod +x script.sh给所有用户加执行权限。
# 给脚本加执行权限 chmod +x deploy.sh # 递归把目录属主改成 app 用户和 app 组 chown -R app:app /opt/app # 查看当前 umask umask # 输出 0022,表示新建文件默认权限是 644,目录是 755umask决定新建文件和目录的默认权限。文件默认最大 666,目录默认最大 777,减去 umask 就是实际权限。umask 0022时,文件是 644,目录是 755。多人协作环境里,umask 0002可以让同组用户也能写。
踩坑记录:chmod -R 777是典型的后悔药场景。有人遇到权限问题就递归 777,结果把 SSH 密钥、配置文件全改成所有人可写,安全审计直接亮红灯。正确做法是先用ls -l看当前权限,判断缺的是哪一组权限,只加必要的位。
4.2 进程管理:ps、top、kill、nohup
ps aux和ps -ef是查看进程的两种常用格式。ps aux | grep nginx找 nginx 进程,top或htop实时看资源占用。
# 查看某个进程的详细信息 ps -ef | grep java | grep -v grep # 按内存占用排序,取前 10 ps aux --sort=-%mem | head -n 10 # 优雅停止进程,先 TERM 再 KILL kill -15 <pid> sleep 3 kill -9 <pid> 2>/dev/null # 后台运行并输出日志 nohup ./start.sh > app.log 2>&1 &kill -15发 SIGTERM,进程可以捕获并做清理;kill -9发 SIGKILL,强制终止,进程没有机会清理。先 15 后 9 是标准流程,直接 -9 可能导致数据丢失或文件锁残留。nohup让进程忽略挂断信号,> app.log 2>&1把标准输出和标准错误都重定向到日志文件,&放到后台。
ps aux | grep会匹配到 grep 自身,加grep -v grep排除。更干净的方式是pgrep -af java,直接按进程名查找并显示完整命令行。
5. 避坑与排查:那些让新手卡半天的细节
命令本身不难,难的是环境差异和边界情况。这一章列 5 条最常见的踩坑记录,每条按「现象 → 原因 → 解决」写,都是实际排查中反复出现的。
5.1 现象:脚本在终端能跑,放到 cron 里就失败
原因:cron 的环境变量和交互式 shell 不同,PATH 通常只有/usr/bin:/bin,脚本里用的命令可能不在这个路径下。另外 cron 不加载.bashrc和.bash_profile。
解决:在脚本开头显式设置 PATH,或者用绝对路径调用命令。在 crontab 里写SHELL=/bin/bash和PATH=/usr/local/bin:/usr/bin:/bin。调试时把脚本输出重定向到文件,看具体报错。
# crontab 示例 SHELL=/bin/bash PATH=/usr/local/bin:/usr/bin:/bin 0 2 * * * /opt/scripts/backup.sh >> /var/log/backup.log 2>&15.2 现象:rm -rf删错目录,数据找不回
原因:rm -rf不经过回收站,直接删除。变量为空时rm -rf $DIR/*会变成rm -rf /*。
解决:删除前先echo确认路径,脚本里用set -u让未定义变量报错,或者用${DIR:?}语法在变量为空时终止执行。重要数据定期备份,删除操作前先mv到临时目录而不是直接rm。
# 安全删除模板 DIR="/data/tmp" if [ -z "$DIR" ] || [ "$DIR" = "/" ]; then echo "invalid dir" exit 1 fi rm -rf "${DIR:?}"/*5.3 现象:grep搜不到中文,或者中文乱码
原因:文件编码是 GBK,终端是 UTF-8,或者grep的 locale 设置不对。
解决:用file -i filename查看文件编码,iconv -f GBK -t UTF-8 file > newfile转换编码。临时设置LANG=C或LC_ALL=C可以让grep按字节匹配,但中文会显示为乱码。长期方案是统一用 UTF-8。
5.4 现象:磁盘满了,但du和df结果对不上
原因:文件被删除但进程还在持有文件句柄,du看不到已删除文件,df仍然统计已分配块。
解决:用lsof | grep deleted找到持有已删除文件的进程,重启该进程释放空间。或者lsof +L1列出所有 link count 为 0 的文件。
# 查找已删除但被占用的文件 lsof +L1 | head -n 20 # 按大小排序,找大文件 du -ah /var | sort -rh | head -n 205.5 现象:tar解压后文件权限全变了
原因:tar默认保留打包时的权限和属主,用 root 打包、普通用户解压时,属主会变成当前用户,权限可能变成 777 或 000。
解决:解压时加--no-same-owner和--no-same-permissions,或者解压后手动chown和chmod。打包时用--owner=app --group=app指定属主。
# 解压时忽略原属主和权限 tar --no-same-owner --no-same-permissions -xzf package.tar.gz # 打包时指定属主 tar --owner=app --group=app -czf package.tar.gz ./app6. 把命令串成工作流:一个日志排查的完整例子
单条命令会了,真正的效率来自组合。这一章用一个「线上服务响应变慢」的排查场景,把前面讲的命令串成一条工作流,展示从发现问题到定位根因的完整过程。这也是我平时排查问题时最常用的套路。
假设某服务部署在/opt/app,日志在/var/log/app/,最近用户反馈接口变慢。第一步看整体负载:
# 看 CPU 和内存整体情况 top -b -n 1 | head -n 20 # 看磁盘使用率 df -h # 看最近 5 分钟的负载 uptimetop -b -n 1是批处理模式输出一次,适合在脚本或非交互环境用。df -h看磁盘,uptime看平均负载。如果负载高但 CPU 不高,可能是 IO 等待,用iostat -x 1 3看磁盘 IO。
第二步定位是哪个进程:
# 按 CPU 排序取前 10 ps aux --sort=-%cpu | head -n 10 # 按内存排序取前 10 ps aux --sort=-%mem | head -n 10 # 查看具体进程的线程情况 top -H -p <pid>top -H -p显示指定进程的线程,如果某个线程占 CPU 特别高,可能是死循环或锁竞争。拿到线程 ID 后可以用jstack(Java)或gdb(C/C++)进一步分析。
第三步看日志找异常:
# 统计最近 1000 行日志里各状态码出现次数 tail -n 1000 /var/log/app/access.log | awk '{print $9}' | sort | uniq -c | sort -rn # 找响应时间超过 1 秒的请求 awk '$NF > 1 {print}' /var/log/app/access.log | tail -n 20 # 按分钟统计请求量,看是否有突增 grep "$(date +%Y-%m-%d)" /var/log/app/access.log | awk '{print $4}' | cut -d: -f1-2 | uniq -c第一条假设日志格式里第 9 列是状态码,统计各状态码次数,如果 500 特别多就是服务端错误。第二条假设最后一列是响应时间,过滤大于 1 秒的请求。第三条按分钟统计请求量,看是否有流量突增。
第四步确认是代码问题还是资源问题:
# 看网络连接状态 ss -s ss -tn state established | wc -l # 看文件描述符使用 lsof -p <pid> | wc -l cat /proc/<pid>/limits | grep "open files" # 看 GC 情况(Java) jstat -gcutil <pid> 1000 5ss -s看 socket 统计,ss -tn state established看已建立连接数。文件描述符接近上限会导致新连接被拒绝。jstat -gcutil每秒输出一次 GC 情况,连续 5 次,如果 Full GC 频繁且耗时长,说明内存分配有问题。
这套流程走下来,大部分「变慢」问题都能定位到具体环节:是流量突增、慢查询、内存泄漏还是连接池耗尽。我自己的习惯是:先看整体指标(top/df/uptime),再看进程(ps),再看日志(grep/awk),最后看细节(ss/lsof/jstat)。顺序不要乱,从粗到细,避免一上来就扎进日志里翻半天。
几个进阶技巧:把常用排查命令写成函数放在.bashrc里,比如alias pscpu='ps aux --sort=-%cpu | head -n 10';用watch -n 2 '命令'每 2 秒刷新一次输出;用script -t 2> timing.log -a session.log记录排查过程,方便复盘。命令是死的,工作流是活的,多练几次就能形成肌肉记忆。
希望帮到你。
本文还有配套的精品资源,点击获取