内容来源:运维高手的 36 项修炼
控制台使用技巧
首先,我们来学习控制台的使用技巧,学习掌握控制台的使用技巧后可以帮助我们熟练快速的操作控制台,提高工作效率;还可以通过快捷键方式避免大量的命令输入,减少错误产生的概率。
那么都有哪些快捷键供我们使用呢?基于我的运维工作经验给你汇总如下:
操作快捷键
- Ctrl + r: 可以快速查找历史命令;
- Ctrl + l: 可以清理控制台屏幕;
- Ctrl + a \ Ctrl + e: 移动光标到命令行首\行尾;
- Ctrl + w \ Ctrl + k: 删除光标之前\之后的内容。
VIM 文件编辑快捷键
- 快捷键 ZZ: 文件保存并退出。
进程操作快捷键
- Ctrl + c: 强制终止程序的执行;
- Ctrl + z: 挂起一个进程;
- Ctrl + d: 终端输入 exit 后回车。
Linux 命令中的快捷键(top)
- Shift + p: 根据CPU使用率排序;
- Shift + m: 根据内存占用排序。
Shell 命令合集
需要注意的是这里的 Shell 命令合集不是简单的单一命令使用,而是讲解 Shell 命令组合的使用,它们的适用场景虽然平时可能很少用到,但通过这节的学习,你能够在遇到此类场景时能够得心应手,而不必临时查找或根据经验拼凑。
首先,我们需要对 Shell 命令合集做一个分类:
空间分析
- 场景1: 磁盘空间不足,需要快速定位日志目录;
- 场景2: 系统产生很多碎片文件,导致 inode 资源不足。
指定文件操作
- 场景1: 批量查找文件作内容替换;
- 场景2: 批量查找文件作拷贝打包。
链接状态分析
- 场景: 想了解用户请求所建立的网络链接状态分析。
IP信息提取
- 场景: Shell 脚本中希望快速提取到本机的 IP。
空间分析 - 场景1
该场景主要应用于磁盘空间不足,需要快速定位或者对文件使用率进行排序,需要查看哪些文件目录或者文件占用的空间比较多,就需要如下组合命令:
1 | du -x --max-depth=1 / |sort -k1 nr |
我们可以看到这一个命令组合由两个 shell 命令组成,前面的 du
命令进行磁盘统计,第二个 sort
命令对统计后的数据进行排序,中间通过管道符来传递数据。管道符的作用是将前一个命令的输出传递到下一个命令的输入。
du 命令中的 -x
参数表示跳过其他文件系统,也就是只分析本文件系统里的文件,它可以帮助我们排除一些非本文件系统的统计信息,这样执行速度会更快也不容易出现一些额外的干扰项。--max-depth
参数设置为 1,这样就可以统计出根目录下第一级目录中的所有文件的大小。第二个命令 sort 中-k
参数指明具体按照哪一列进行排序;-n
参数表示只对数值进行排序,而 -r
参数表示反向排序。那整体分析 sort 这一段命令的意思就是指定第一列并按照数据大小做反序排序。
空间分析 - 场景2
场景2 适用于系统上产生了很多碎片时,随之产生大量的 Inode,Inode 用于存放着文件系统中文件的源数据,Inode 过度使用会导致系统 Inode 资源不足。这种情况是不正常的,这时候分析如果通过 du 命令只能具体展示磁盘空间的使用情况,但并不能分析出具体目录下产生了多少碎片文件,我们就需要如下的命令组合来对文件进行统计分析。
1 | find -type f | awk -F / -v OFS=/ '{$NF="";dir[$0]++}END{for (i in dir)print dir[i]" "i}' | sort -k 1 -nr |head |
基于管道可以将这个命令组合切割成四部分,分别是 find
, awk
, sort
, head
命令。
其中 find 命令通过 -type f 参数查找指定文件类型的文件,然后将查找结果通过管道符传递给 awk,它可以把文件内容按行进行格式化输出并展示,-F / 指定处理文件时字符串以 / 进行分割,-v OFS=/ 表示文件显示结果时以 / 进行分割展示。对于 awk 命令整体规则而言,有一个 {}END{} 格式,前面的 {} 表示行处理操作,END{} 表示行处理后需要进行整体结果输出。在行处理操作逻辑中,设置 $NF 为空表示将每一行的文件名信息去除,从而只保留目录路径,dir 是一个自增数组,用于统计结果。最后通过 for 循环进行遍历输出 dir 关联数组中所有行信息。
因为这个命令组合比较复杂,我们可以在控制台中看具体的演示,首先在控制台输入这一串命令组合:
1 | [root@salt-master /]# find -type f | awk -F / -v OFS=/ '{$NF="";dir[$0]++}END{for (i in dir)print dir[i]" "i}' | sort -k 1 -nr |head |
可以看到在当前目录路径通过执行命令,结果中已经把每一个产生文件的路径都展示出来了,并且前面还会显示在每一个路径下一共包含了多少文件,如果我们系统提示inode使用率问题,需要分析出哪个路径下的文件最多,这时候就可以通过这个组合命令来进行分析。
文件操作 - 场景1
文件操作的场景主要有两个,第一个场是批量文件内容需要进行替换,也就是当我们在一个文件目录下面有多级子目录,并且子目录中有大量的文件,而我们需要对目录下的某一个名称的文件批量的查找替换内容。面对这种场景我们可以使用如下的组合命令:
1 | find ./ -type f -name consumer.xml -exec sed -i "s/aaaaaa/bbbbbb/g" {} \; |
我们通过 find
+ 路径
的方式查找需要批量修改的指定的文件名,比如命令中的 consumer.xml
文件,查找到文件后通过 find
自带的参数exec
将结果传递给另外一条命令 sed
来进行下一步命令的处理。
find命令中,-name参数指定查找的文件名,-exec参数将查找到的内容传递给下一个命令去继续执行相关逻辑,sed命令主要对文件内容进行替换,这里会将consumer文件中的 aaaaaaa 替换成 bbbbbb,这就是一个批量查找替换的操作。
文件操作 - 场景2
文件操作的第二种场景是我们需要对文件进行批量的打包,拷贝,你可以看到下面的这样的一个组合命令:
1 | (find . -name "*.txt" | xargs tar -cvf test.tar) && cp -f test.tar /home/. |
首先我们来看下括号中的部分,括号中包含两条命令,它们使用管道符进行连接,括号外通过 “&&” 符号与第三条命令进行连接,也就是我们首先需要执行括号中的组合命令,先查找所有.txt文件,然后将结果传递给 xargs 命令进行打包,如果打包成功后才将压缩包传递给 cp 命令进行拷贝。
网络链接状态分析
对于网络连接状态分析是运维工程师经常需要做的事情,因为我们经常需要了解系统对外提供的网络服务是否正常,并了解它们的连接状态,这时就可以通过如下的命令组合进行操作:
1 | netstat -n | awk '/^tcp/ {++S[$NF]}END{for(a in S) print a, S[a]}' |
我们先来分析下这个命令组合的构成,整体上来说它由两个命令组成,第一个命令是 netstat -n
, 这个命令负责查看主机上的所有 TCP,UDP 链接信息,而 awk
命令则负责对这些信息进行进一步的处理,awk 后有一个用两个 “斜杠” 括起来的正则表达式,主要匹配以 TCP 开头的每一行信息,所以这里的正则表达式起到了一个过滤的作用(只分析 tcp 的连接),后面则是对信息过滤后进行具体的统计和输出。
IP 信息提取
而另外一个场景就是提取主机上的 IP 信息,这里推荐使用如下的命令组合:
1 | ip a |grep "global" |awk '{print $2}' |awk -F / '{print $1}' |
可以看到它的结构组成也比较简单,分别是由四个命令组合而成,前面的 ip a
负责查看主机上所有网卡的信息,然后通过grep
进行条件过滤,再通过awk
实现第二列内容输出,最后通过 awk
以指定 /
作为分隔符来打印第一列的信息。