本模块讲解 Shell 命令合集与对控制台的使用技巧。这里的 Shell 命令合集不是简单的单一命令使用,而是Shell 命令的组合使用——它们平时可能很少用到,但当你遇到此类场景时能够得心应手,而不必临时查找或凭经验拼凑;同时通过组合命令的学习,你对基础命令的理解也能得到进一步提升。
在学习之前需要掌握两部分知识:一是需要熟悉掌握 Linux,二是需要了解 TCP 三次握手原理,因为本模块的命令合集包含对计算机进行网络分析的内容。
管道符 | 的作用是将前一个命令的输出传递到下一个命令的输入。几乎所有 Shell 组合命令都是围绕管道展开,把多个单一命令串接成一条分析流水线。
Shell 命令合集大体可按应用场景分类:
| 类别 | 典型场景 |
|---|---|
| 空间分析 | 磁盘空间不足定位日志目录;碎片文件过多导致 inode 资源不足 |
| 指定文件操作 | 批量查找文件作内容替换;批量查找文件作拷贝打包 |
| 链接状态分析 | 了解用户请求所建立的网络连接状态 |
| IP 信息提取 | Shell 脚本中快速提取本机 IP |
上图为 Shell 组合命令的通用结构:一个数据源命令(如 du、find、netstat、ip a)产生原始数据,经管道交给处理命令(awk、grep、sort)进行格式化、过滤与统计,再汇总排序(sort -nr、uniq -c),最后用 head 取前 N 条关键结果。理解这条流水线即可拆解各种复杂组合命令。
场景 1:磁盘空间不足,需快速定位哪一些目录或文件占用空间比较多:
du -x --max-depth=1 / | sort -k1 -nrdu 执行磁盘统计,sort 对统计结果排序,中间用管道 | 传递数据;du 的 -x 跳过其他文件系统,只分析本文件系统内的文件,执行更快且减少干扰;--max-depth=1 统计根目录下第一级目录的所有文件大小;sort 的 -k 指明按哪一列排序,-n 只对数值排序,-r 反向排序。场景 2:系统产生很多碎片文件导致 inode 资源不足(inode 用于存放文件系统中文件的元数据,过度使用会导致资源不足)。du 只能展示磁盘空间使用情况,不能分析出具体目录产生了多少碎片,需用命令组合对文件数统计分析:
find -type f | awk -F/ -v OFS=/ '{$NF="";dir[$0]++}END{for(i in dir)print dir[i]" "i}' | sort -k1 -nr | headfind -type f 查找指定文件类型的文件,结果经管道传向 awk;awk 按行格式化并展示,-F / 指定以 / 分割处理,-v OFS=/ 表示结果显示以 / 分割;awk 的 { } END { } 格式中,前面的 { } 是行处理操作,END { } 是行处理完成后整体输出;行处理中将 $NF 置空去除每行的文件名,只保留目录路径,dir 是一个自增数组用于统计;for 循环遍历输出 dir 关联数组的所有行信息,经 sort -nr 排序、head 取前 N 条。上图为空间分析的流程:需要定位大目录时用 du 按大小排序;需要统计碎片文件数(inode 排障)时用 find 找出文件、awk 按目录路径归类计数、sort 排序、head 取前 N 条。两者都能快速输出占用/文件数靠前的目标。
场景 1:目录下有多级子目录和大量文件,需对某个名称的文件批量的查找替换内容:
find ./ -type f -name consumer.xml -exec sed -i "s/aaaaaa/bbbbbb/g" {} \;find 通过 -name 指定要查找的文件名(如 consumer.xml);find 自带参数 -exec 将查找到的结果传递给下一条命令 sed 进行处理;sed 对文件内容进行替换,将 consumer.xml 中的 aaaaaa 替换成 bbbbbb。这就是批量查找替换操作。场景 2:对文件进行批量的打包、拷贝:
(find . -name "*.txt" | xargs tar -cvf test.tar) && cp -f test.tar /home/.括号内包含两条命令,用管道连接,括号外通过 && 与第三条命令连接:先执行括号中的组合命令查找所有 .txt 文件,结果传递给 xargs 进行打包;打包成功后才把压缩包传给 cp 进行拷贝。
操作快捷键:
| 快捷键 | 作用 |
|---|---|
Ctrl + r | 快速查找历史命令 |
Ctrl + l | 清理控制台屏幕 |
Ctrl + a / Ctrl + e | 移动光标到命令行首 / 行尾 |
Ctrl + w / Ctrl + k | 删除光标之前 / 之后的内容 |
Vim 文件编辑快捷键:ZZ 保存并退出文件。
进程操作快捷键:
| 快捷键 | 作用 |
|---|---|
Ctrl + c | 强制终止程序的执行 |
Ctrl + z | 挂起一个进程 |
Ctrl + d | 发送 EOF 结束输入(等同输入 exit 回车,退出会话) |
top 命令的快捷键:
| 快捷键 | 作用 |
|---|---|
Shift + p | 根据 CPU 使用率排序 |
Shift + m | 根据内存占用排序 |
运维经常需要了解系统对外提供的网络服务是否正常及其连接状态:
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'netstat -n 查看主机上所有 TCP、UDP 连接信息;awk 负责进一步处理;awk 后两个斜杠括起来的是正则表达式,匹配以 tcp 开头的每一行——正则起到过滤作用(只分析 TCP 连接);Shell 脚本中快速提取本机 IP:
ip a | grep "global" | awk '{print $2}' | awk -F/ '{print $1}'ip a 查看主机上所有网卡的地址信息;grep 条件过滤出 global 行;awk 输出第二列内容(形如 IP/掩码);awk 以 / 作为分隔符打印第一列(纯净的 IP 地址)。上图为提取本机 IP 的管道流程:ip a 输出所有网卡信息,grep 过滤出带 global 的地址行,第一次 awk 取第二列(IP/掩码),第二次 awk 按 / 分割取第一列,最终得到纯净的 IP 地址。
uniq/awk 统计需先排序:uniq 只合并相邻相同行,统计前必须先 sort,否则计数不准确。du 无法体现,需用 find | awk 统计文件数。-exec 与 xargs 的使用场景:find -exec 适合把结果直接传给单条命令;批量处理、构造复杂参数时 xargs 更灵活。&& 与 | 语义差异:| 是数据传递,&& 是"前一条成功才执行后一条",混合时需注意执行顺序。nohup 把并发命令放入后台,但存在进程状态不好控制、进程间信息共享一般以文件方式进行等问题。需要大的自动化工程任务作并发时,建议选择 Python、Go、PHP 等语言。ssh 用户@主机IP /home/ieson/imoocc.sh 参数 的方式;但批量主机任务建议选择 ansible、saltstack 等成熟专业的工具实现。awk、sort、uniq、xargs、find 各命令的细粒度参数,用 man 查阅;| 把一个命令的输出传给下一个命令的输入,是组合命令的基础;du | sort -nr,统计碎片文件用 find | awk | sort | head;find -exec sed,批量打包用 find | xargs tar;netstat -n | awk,提取 IP 用 ip a | grep | awk;