Shell工作实践:三剑客

Linux正则表达式和三剑客grep、awk、sed。

  • grep更适合单纯的查找或匹配文本
  • sed更适合编辑匹配到的文本
  • awk更适合格式化文本,对文本进行较复杂格式处理。

1.最常用操作:

1.自动补全文件名:输入前面几个字母点击:tab键补全  

2.创建目录:mkdir;(删除目录:rmdir) 创建文件:vi ;  a进入编辑页面;esc退出编辑页面;

 :wq保存    :w   filename  保存至指定文件名  :q  不保存直接退出

3。pwd :当前目前绝对路径

4.chmod  :授权 (文件拥有者:u:User,g:Group,o:Other,a:All,)(文件权限:r:读:数字代号为"4",w:写:数字代号为"2"。r:执行:数字代号为"1")(+:增权限,-:删权限):chmod a+rwx filename 给文件增加读写和执行的权限

5.cp file1 file2 (copy文件1至2)

6.cat aa.txt bb.txt >> all.txt 合并文件

7.配置网关地址:

第一步:ip addr 获取ip地址

第二步:vi /etc/sysconfig/network-scripts/ifcfg-ens33,然后编辑文件 : ifcfg-ens33

第四步:systemctl restart network  重启网络命令

第五步:reboot  重启虚拟机命令

2.基本指令

Sed(Stream EDitor)

sed 的工作流程主要包括读取、执行和显示三个过程。

读取:sed 从输入流(文件、管道、标准输入)中读取一行内容并存储到临时的缓冲区中(又称模式空间,pattern space)。
执行:默认情况下,所有的 sed 命令都在模式空间中顺序地执行,除非指定了行的地址,否则 sed 命令将会在所有的行上依次执行。
显示:发送修改后的内容到输出流。在发送数据后,模式空间将会被清空

常用选项:

-e   表示用指定命令或者脚本来处理输入的文本文件,只有一个编辑命令时可省略
 
-f   表示用指定的脚本文件来处理输入的文本文件
 
-n   表示仅显示处理后的结果
 
-i.bak   直接编辑文本文件,不输出结果
 
-r, -E   使用扩展正则表达式
 
 -s  将多个文件视为独立文件,而不是单个连续的长文件流

常用操作:

a:增加,在当前行下面增加一行指定内容。
c:替换,讲选定行替换为指定内容。
d:删除,删除选定的行。
i:插入,在选定行上面插入一行指定内容。
p:打印,如果同时指定行,表示打印指定行;如果不指定行,则表示打印所有内容,如果又非打印字符,则以ASCLL码输出。通常与“-n”选项一起使用。
s:替换,替换指定字符
y:字符转换

sed两种基本语法,常用一种为,此处仅展示此种情况:

sed [选项] '操作' 参数

用法示例:

1.输出指定行:sed -n 'p' test.txt

选项:n:表示仅显示处理后的结果 

操作:p:打印,如果同时指定行,表示打印指定行;如果不指定行,则表示打印所有内容,如果又非打印字符,则以ASCLL码输出。

常用:sed -n '3p' passwd.txt    //输出第 3 行

sed -n 'p' passwd.txt          //输出所有内容,等同于 cat test.txt
 
sed -n '3p' passwd.txt    //输出第 3 行
 
sed -n '3,5p' passwd.txt    //输出 3~5 行
 
sed -n 'p;n' passwd.txt    //输出所有奇数行,n 表示读入下一行资料
 
sed -n 'n;p' passwd.txt    //输出所有偶数行,n 表示读入下一行资料
 
sed -n '1,5{p;n}' passwd.txt //输出第 1~5 行之间的奇数行(第 1、3、5 行)
 
sed -n '10,${n;p}' passwd.txt    //输出第 10 行至文件尾之间的偶数行
 
sed -n '2,+3p' passwd.txt    //从第2行开始,连续3行进行输出,即输出2~5行
--正则:以“/”包围

sed -n '/the/p' text.txt           //输出包含the 的行

sed -n '2,/the/p' text.txt       //输出从第 4 行至第一个包含 the 的行

sed -n '/the/=' text.txt         //输出包含the 的行所在的行号,等号(=)用来输出行号

sed -n '/^PI/p' text.txt          //输出以PI 开头的行

sed -n '/[0-9]$/p' text.txt     //输出以数字结尾的行

sed -n '/\/p' text.txt     //输出包含单词wood 的行
2.插入符合条件的行:sed 'i' test.txt  或   sed 'a' test.txt

操作:a:增加,在当前行下面增加一行指定内容。i:插入,在选定行上面插入一行指定内容。

sed '/the/i 有手就行' text.txt    //在含有the行的前面一行添加有手就行

sed '/the/a 有手\n就行' text.txt   //在含有the行的下一行添加有手就行(\n换行)

sed '3a看看就会' text.txt       //在第3行之后插入字符
3.删除符合条件的行:nl text.txt | sed '3d'   //删除第3行

操作:d:删除,删除选定的行。

nl命令用于计算文件的行数,结合该命令可以更加直观地查看到命令执行的结果。
 
nl text.txt | sed '3d'   //删除第3行
 
nl text.txt | sed '3,5d'  //删除第3~5行
 
nl text.txt |sed '/cross/d'  //删除包含 cross 的行,原本的第 8 行被删除;如果要删除不包含 cross 的行,用!符号表示取反操作, 如'/cross/!d'
 
sed '/^[a-z]/d' text.txt   //删除以小写字母开头的行
 
sed '/\.$/d' text.txt      //删除以.结尾的行
4.替换符合条件的文本:sed 's/the/THE/' text.txt      //将每行中的第一个the 替换为 THE

操作:s:替换,替换指定字符

使用场景:生成数据脱敏

sed 's/the/THE/' text.txt      //将每行中的第一个the 替换为 THE

sed 's/l/L/2' text.txt           //将每行中的第 2 个 l 替换为 L

sed 's/the/THE/g' text.txt    //将文件中的所有the 替换为 THE

sed 's/o//g' text.txt        //将文件中的所有o 删除(替换为空串)

sed 's/^/#/' text.txt       //在每行行首插入#号

sed '/the/s/^/#/' text.txt      //在包含the 的每行行首插入#号

sed '3,5s/the/THE/g' text.txt    //将第 3~5 行中的所有 the 替换为 THE

sed '/the/s/o/O/g' text.txt      //将包含the 的所有行中的 o 都替换为 O
5.迁移符合条件的文本sed '/the/w out.file' text.txt    //将包含the 的行另存为文件 out.file

操作:H:复制到剪贴板;
g、G:将剪贴板中的数据覆盖/追加至指定行;
w:保存为文件;
r:读取指定文件;
a:追加指定内容。具体操作方法如下所示。
I,i   忽略大小写

sed '/the/{H;d};$G' text.txt    //将包含the 的行迁移至文件末尾,{;}用于多个操作
sed '1,5{H;d};14G' text.txt    //将第 1~5 行内容转移至第 17 行后
sed '/the/w out.file' text.txt    //将包含the 的行另存为文件 out.file
sed '/the/r /etc/hostname' text.txt    //将文件/etc/hostname 的内容添加到包含 the 的每行以后
sed '3aNew' text.txt    //在第 3 行后插入一个新行,内容为New
sed '/the/aNew' text.txt    //在包含the 的每行后插入一个新行,内容为 New
sed '3aNew1\nNew2' text.txt    //在第 3 行后插入多行内容,中间的\n 表示换行

awk (不是个单词,由人名组成)

常用于扫描、过滤、统计汇总工作。执行结果可以通过print的功能将字段数据打印显示

AWK工作原理

● sed命令常用于一整行的处理,而awk比较倾向于将一行分成多个"字段"然后再进行处理,且默认情况下字段的分隔符为空格或tab键。awk 执行结果可以通过print的功能将字段数据打印显示。

●在使用awk命令的过程中,可以使用逻辑操作符"&&“表示"与”、"||“表示"或”、"!“表示"非”;还可以进行简单的数学运算,如+、-、*、/、%、^分别表示加、减、乘、除、取余和乘方。

●awk后面接两个单引号并加上大括号{ }来设置想要对数据进行的处理操作,awk可以处理后续接的文件,也可以读取来自前个命令的标准输。

基本格式两种,与sed一致:

1.awk [选项] ‘模式条件{操作}’ 文件1 文件2 ...
2.awk -f 脚本文件 文件1 文件2…

常见内建变量

FS	列分割符。指定每行文本的字段分隔符,默认为空格或制表位。与"-F"作用相同
NF	当前处理的行的字段个数。
NR	当前处理的行的行号(序数)。
$0	当前处理的行的整行内容。
$1	代表第一列的内容
$2	代表第二列的内容
$n	当前处理行的第n个字段
FILENAME	被处理的文件名。
RS	行分隔符

数据记录分隔,默认为\n,即每行为一条记录。

用法示例:

1.基础应用:输出1,2,3行  awk '(NR>=1)&&(NR<=3){print}' test.txt

变量:NR:当前处理的行的行号(序数)。

{print}:输出

--输出全部
awk '{print}' test.txt
awk '{print $0}' test.txt
输出 1行和3行
awk 'NR==1,NR==3{print}' test.txt
输出1,2,3行
awk '(NR>=1)&&(NR<=3){print}' test.txt
输出1,3行
awk 'NR==1||NR==3{print}' test.txt
#输出4-8行,或10行
awk '(NR>=4&&NR<=8)||NR==10 {print $0}' test.txt
 #输出所有奇数行
awk '(NR%2)==1{print}' test.txt
 #输出所有偶数行
awk '(NR%2)==0{print}' test.txt         
2.配合正则表达式使用输出awk 'BEGIN {x=0}; /nologin$/ {x++; print x, $0}; END {print x}' /etc/passwd     统计所有行并输出每行,最后输出计数x

知识点:1)/^nologin/:以nologin开头  /nologin$/:以nologin结尾

2)wc 命令用于计算字数。

参数:-c, --bytes:统计字节数。

-m, --chars:统计字符数。

-w, --words:统计字数。

-l, --lines:统计行数。

 -L, --max-line-length:统计最长行的长度

3)阅读:awk 'BEGIN {x=0}; /nologin$/ {x++; print x, $0}; END {print x}' /etc/passwd

#输出以root开头的行
awk '/^root/{print}' test.txt 
 #输出以 nologin 结尾的行 
awk '/nologin$/{print}' test.txt
 #输出不是第10行的所有行  
awk 'NR!=10 {print $0}' test.txt  
#统计以nologin为结尾的行数
[root@localhost ~]# grep -c "nologin$" /etc/passwd
统计所有nologin结尾的行,并以行计数(只输出多少行的计数)
[root@localhost ~]# awk '/nologin$/ {print $0}' /etc/passwd | wc -l
统计弄哦login结尾的行,并最后输出计数x
[root@localhost ~]# awk 'BEGIN {x=0}; /nologin$/ {x++}; END {print x}' /etc/passwd
统计所有行并输出每行,最后输出计数x
[root@localhost ~]# awk 'BEGIN {x=0}; /nologin$/ {x++; print x, $0}; END {print x}' /etc/passwd
3.按字段输出文本awk -F ":" '!($3<200){print}' /etc/passwd    #输出以":"分割第三部分不小于200的行
#输出以root开头的行的第一部分:-F:  “:”冒号分割
[root@localhost ~]# awk -F: '/^root/ {print $1}' /etc/passwd
 
#输出以root开头的行的第一部分和第三部分
[root@localhost ~]# awk -F: '/^root/ {print $1,$3}' /etc/passwd
 
#输出以root开头的行的第一部分和第三部分,最后一部分
[root@localhost ~]# awk -F: '/^root/ {print $1,$3,$NF}' /etc/passwd
 
#输出第三部分不小于200的行
[root@localhost ~]# awk -F ":" '!($3<200){print}' /etc/passwd 
 
#以冒号为分隔符,第三部分大于等于1000。先处理完BEGIN的内容,再打印文本里面的内容
[root@localhost ~]# awk 'BEGIN {FS=":"};{if($3>=1000){print}}' /etc/passwd
4.增加操作符awk -F ":" '($1~"root")&&(NF==7){print $1,$2}' /etc/passwd   输出第1个字段中包含root且有7个字段的行的第1、2个字段

~:表示包含

NF:当前处理的行的字段个数。

#!表示为取反
[root@localhost ~]# awk -F: '!($3>8) {print $3,$1}' /etc/passwd
[root@localhost ~]# awk -F: 'BENGIN {FS=":"}; !($3>8) {print $3,$1}' /etc/passwd

#($3>$4)?$3:$4;三元运算符,如果第3个字段的值大于等于第4个字段的值,则把第3个字段的值赋给max,否则第4个字段的值赋给max
[root@localhost ~]# awk 'BEGIN {FS=":"};{if($3>=1000){print}}' /etc/passwd

#输出以冒号分隔且第7个字段中包含/bash的行的第1个字段,~意思为包含
[root@localhost ~]# awk -F ":" '$7~"/bash"{print $1}' /etc/passwd
 
#输出第1个字段中包含root且有7个字段的行的第1、2个字段
[root@localhost ~]# awk -F ":" '($1~"root")&&(NF==7){print $1,$2}' /etc/passwd
 
#输出第7个字段既不为/bin/bash,也不为/sbin/nologin的所有行
[root@localhost ~]# awk -F ":" '($7!="/bin/bash")&&($7!="/sbin/nologin"){print}' /etc/passwd

5.实战应用:free -m | awk '/Mem/ {print $3/$2 * 100"%"}   内存使用率占比

top -b -n1 | awk -F, '/%Cpu/ {print $4}' cpu使用率占比

变量: NR:当前处理的行的行号(序数)。
$0    当前处理的行的整行内容。
$1    代表第一列的内容
$2    代表第二列的内容
$n    当前处理行的第n个字段
FILENAME    被处理的文件名。
RS    行分隔符

#输出行号和内容
[root@localhost ~]# awk '{print NR,$0}' a
 
#输出行号和内容
[root@localhost ~]# awk '{print NR,$0};END{print NR}' a

#以冒号为分隔符,输出内容和行号
[root@localhost ~]# echo $PATH | awk 'BEGIN{RS=":"}; {print NR,$0}'

#调用w命令,并用来统计在线用户数
[root@localhost ~]# awk 'BEGIN {n=0 ; while ("w" | getline) n++ ; {print n-2}}'

#查询用户名
[root@localhost ~]# awk 'BEGIN {"hostname" | getline ; {print $0}}'

#内存使用率占比
[root@localhost ~]# free -m | awk '/Mem/ {print $3/$2 * 100"%"}
#内存空闲率占比
[root@localhost ~]# free -m | awk '/Mem/ {print ($2-$3)/$2 * 100"%"}'

#cpu使用率占比(awk '{print 100-$1"%"}'执行有问题)
[root@localhost ~]# top -b -n1 | awk -F, '/%Cpu/ {print $4}' | awk '{print 100-$1"%"}'


#查询各种数值的重复次数
[root@localhost ~]# cat test.txt | awk '{a[$1]++};END{for(i in a){print i,a[i]}}'
5.偶尔会用的额外知识:date -d "-1 day " +"%Y/%m/%d"   一天前日期

1.date时间输出   date -d "$(cat /proc/uptime | awk -F. '{print $1}') second ago" +"%Y%m%d %H:%M:%S"  

[root@localhost ~]# date -d "1 month" +"%Y/%m/%d"          #下个月的今天
[root@localhost ~]# date -d "1 month" +"%Y/%m/01"          #下个月第一天
[root@localhost ~]# date +"%Y/%m/01"                       #当月第一天
[root@localhost ~]# date -d "1 month ago" +"%Y/%m/%d"      #一个月前的今天
[root@localhost ~]# date -d "1 day ago" +"%Y/%m/%d"        #1天前
[root@localhost ~]# date -d "-1 day " +"%Y/%m/%d"          #1天前
[root@localhost ~]# date -d "$(date +%Y%m01) -1 day" +%Y/%m/%d    #上个月的最后一天
[root@localhost ~]# date -d "$(date -d "1 month" +%Y%m01) -1 day" +%Y/%m/%d  #当月最后一天
 
[root@localhost ~]# date -d "$(cat /proc/uptime | awk -F. '{print $1}') second ago" +"%Y%m%d %H:%M:%S"         
#显示上次系统重启时间,等同于uptime;second ago为显示多少秒前的时间,+"%F %H:%M:%S"等同于+"%Y-%m-%d %H:%M:%S"的时间格式
/proc/uptime 第一列输出的是,系统启动到现在的时间(以秒为单位);第二列输出的是,系统空闲的时间(以秒为单位)
date -d "$(date -d"1 month" +"%Y%m01") -3 day" +"%Y%m%d"  当月倒数第三天
date +"%Y%m01"        当月第一天

2.获取奇数偶数行

知识点:seq 10 输出数字

[root@localhost ~]# seq 10 | awk '{getline; print $0}'    #获取偶数行
[root@localhost ~]# seq 10 | awk '{print $0; getline}'    #获取奇数行
当getline左右无重定向符“<”或“|”时,awk首先读取到了第一行,就是1,然后getline,就得到了1下面的第二行,就是2,因为getline之后,awk会改变对应的NF,NR,FNR和$0等内部变量,所以此时的$0的值就不再是1,而是2了,然后将它打印出来。
当getline左右有重定向符“<”或“|”时,getline则作用于定向输入文件,由于该文件是刚打开,并没有被awk读入一行,只是getline读入,那么getline返回的是该文件的第一行,而不是隔行。

3.分割符:OFS=“|”指定以“|”为分隔符

#OFS为指定分隔符
[root@localhost ~]# echo "A B C D" | awk '{OFS="|";print $0;$1=$1;print $0}'               
#以|为分隔符输出
[root@localhost ~]# echo "A B C D" | awk '{OFS="/";print $0;$1=$1;print $0}'
#以/为分隔符输出

4.数组

#输出数组的下标位为1的数值
[root@localhost ~]# awk 'BEGIN{a[0]=1; a[1]=2; a[2]=3; print a[1]}' 
2
#输出数组的下标位为0的数值
[root@localhost ~]# awk 'BEGIN{a[0]=1; a[1]=2; a[2]=3; print a[0]}'
1
#也可以用字符串定义数组
[root@localhost ~]# awk 'BEGIN{a["abc"]=1; a["def"]=2; a["xyz"]=3; print a["abc"]}'
1
[root@localhost ~]# awk 'BEGIN{a["abc"]=1; a["def"]=2; a["xyz"]=3; print a["xyz"]}'
3
#输出数值和下标位
[root@localhost ~]# awk 'BEGIN{a[0]=1; a[1]=2; a[2]=3; for(i in a){print i,a[i]}}'
0 1
1 2
2 3

5.查重

#查询各种数值的重复次数
[root@localhost ~]# cat test.txt | awk '{a[$1]++};END{for(i in a){print i,a[i]}}'

grep

grep命令是一种强大的文本搜索工具,主要考虑grep+正则表达式-->并把匹配的行打印出来。

grep家族: grep, egrep, fgre

正则都要用,这里干脆单独弄一个文章说:

好了,正则知道后:

常见格式:

grep [options] PATTERN [FILE...]

常见变量

grep [options] PATTERN [FILE...]
	-i:忽略大小写
	--color:匹配到的字符带颜色
	-v::显示没有被模式匹配到的行
	-o:只显示被模式匹配到的字符串
	-E: 使用扩展正则表达式
	-A n: 显示匹配到的行和其后的n行
	-B n: 前的n行
	-C n: 前后各n行
	-n	显示匹配的行号
	-w	被匹配的文本只能是单词,而不能是单词中的某一部分
	-c	统计匹配的行数,而不是显示被匹配到的内容
	-R,-r	查询递归目录下的所有文件

用法示例:

1.在大量文件中快速过滤/etc/文件夹下包含root单词的所有文件grep -rw 'root' /etc(不包含文件名包含root吧?服务器为执行成功,奇怪)

变量:
    -w    被匹配的文本只能是单词,而不能是单词中的某一部分
    -R,-r    查询递归目录下的所有文件

grep -rw 'root' /etc
2.常用正则表达式:(.单匹配)(*多匹配)({n}设定次数匹配)
以a开头的文件   ^a
grep "^a" test.txt
以a结尾的文件   a$
grep "a$" test.txt
*前面的a出现0次或多次
grep "a*" test.txt
匹配 .  除换行符以外的单个字符
grep "a..a" test.txt
grep "a.a" test.txt
.*  表示任意长度的任一字符,不包括0次
grep "a.*" test.txt
\{n\}  匹配前面的子表达式n次
grep "a\{2\}aa" test.txt 
2.正则表达式元字符(+一次以上)(? 0到1次)(( )括号中看成整体)(|或的方式匹配)
匹配子表达式:a 1次以上
grep -E "a+" test.txt 
匹配子表达式:a 0到1次
grep -E "a?" test.txt
匹配子表达式:aaa
grep -E "a(aaa)" test.txt
匹配子表达式:aaa  或者bbb
grep -E "a(aaa)|(bbb)" test.txt

附件一个性能监控脚本

1.内存 >90%  ,CPU>80%,磁盘>90%及告警

#!/bin/bash
NC=$(expr $(free | grep "Mem:" | awk '{print $3}') \* 100 / $(free|grep "Mem:"|awk '{print $2}'))		#查看内存状态并转化为百分比
CPU=$(expr 100 - $(mpstat |tail -1 | awk '{print $12}' |awk -F. '{print $1}'))	#查看CPU状态并提取出百分比数值
CP=$(df -h |grep "/$" |awk '{print $5}'|awk -F% '{print $1}')		#查看磁盘状态并提取百分比
GJ="gaojing.txt"		#定义一个告警的文件
GJmail="[email protected]"		#定义告警需要发送的邮箱
if [ $NC -gt 90 ];then			#判断内存是否大于等于百分之90,是就存到告警文件中
echo "内存使用率:$NC% >> $GJ"
fi
if [ $CPU -gt 80 ];then		#同理CPU超80就存到告警文件
echo "cpu使用率:$CPU >> $GJ"
fi
if [ $CP -gt 90 ];then		#磁盘超过90就存到告警文件
echo "根分区磁盘占用率:$CP >> $GJ"
fi
if [ -f $GJ ];then
cat $GJ | mail -s "警告" $GJmail
rm -rf $GJ
fi
chmod 777 /root/sysmon.sh
echo "*/30 * * * * /root/sysmon.sh"  >> /var/spool/cron/root	#写一个周期任务每30分钟执行一次脚本监控

2.性能监控脚本(全面,但一般不用这么全面)

#!/bin/bash
#功能描述:监控服务器主要性能参数指标
#监控项目:内核信息、主机名称、ip地址、登录账户、内存与swap信息、磁盘信息、CPU负载

kernel=$(uname -r)                                 #内核信息
release=$(cat /etc/centos-release)                 #操作系统版本
hostname=$HOSTNAME                                 #主机名称
localip=$(ip a s | awk '/inet /{print $2}'|tail -1)        #本地ip地址列表
mem_total=$(free | awk '/Mem/{print $2}')          #总内存容量
mem_free=$(free | awk '/Mem/{print $NF}')          #剩余内存容量
mem_used=$(free -t | awk 'NR == 2 {printf("%.2f%     \n"), $3/$2*100}')    #已使用内存百分比
cpu_used=$(top -b -n1 | head -5 | grep ^%Cpu | awk '{printf("%.2f%     "),100-$8}')    #已使用CPU百分比
swap_total=$(free | awk '/Swap/{print $2}')        #总swap容量
swap_free=$(free | awk '/Swap/{print $NF}')        #剩余swap容量
disk=$(df | awk '/^\/dev/{print $1,$2,$4}' | column -t)   #磁盘信息
load1=$(uptime | sed 's/,//g' | awk '{print $(NF-2)}')    #cpu最近1分钟的平均负载
load5=$(uptime | sed 's/,//g' | awk '{print $(NF-1)}')    #cpu最近1分钟的平均负载
load15=$(uptime | sed 's/,//g' | awk '{print $(NF)}')     #cpu最近1分钟的平均负载
login_users=$(who | wc -l)                         #登录用户数量
procs=$(ps -aux | wc -l)                           #进程总数
users=$(sed -n '$=' /etc/passwd)                   #系统总账户数量
cpu_info=$(LANG=C lscpu | awk -F: '/Model name/{print $2}'| tr -s ' ' | sed 's/^ //')  #cpu型号
cpu_core=$(awk '/processor/{core++} END{print core}' /proc/cpuinfo)       #cpu核心数量

yum -y -q install sysstat &> /dev/null             #安装性能监控软件
echo -e "\e[34提取磁盘性能指标,请稍后...\e[0m"
tps=$(LANG=C sar -d -p 1 6 | awk '/Average/' | tail -n +2 | awk '{print "["$2"]磁盘平均IO数量:"$3}') 
read_write=$(LANG=C sar -d -p 1 6 | awk 'Average' | tail -n +2 | awk '{print "["$2"]平均每秒读写扇区量:"$4,$5}') 

irq=$(vmstat 1 2 | tail -n +4 | awk '{print $11}') #中断数量
cs=$(vmstat 1 2 | tail -n +4 | awk '{print $12}')  #上下文切换数量

top_proc_mem=$(ps --no-headers -eo comm,rss | sort -k2 -n | tail -10)     #占用内存最多的10个进程
top_proc_cpu=$(ps --no-headers -eo comm,pcpu | sort -k2 -n | tail -5)     #占用cpu最多的5个进程

#获取网卡流量,接收|发送的数据流量,单位为字节(bytes)
net_monitor=$(cat /proc/net/dev | tail -n +3 | awk 'BEGIN{print "网卡名称 入站数据流量(bytes)出站数据流量(bytes)"} {print $1,$2,$10}' | column -t )



#输出数据信息
echo -e "\033[32m--------------本机主要数据参数表--------------\033[0m"
echo -e "本机IP地址列表:\033[32m ${localip} \033[0m"
echo -e "本机主机名称:\033[32m$hostname\033[0m"
echo -e "操作系统版本:\033[32m$release\033[0m,内核版本:\033[32m$kernel\033[0m"
echo -e "CPU型号为:\033[32m$cpu_info\033[0m,CPU内核数量:\033[32m$cpu_core\033[0m"
echo -e "已使用CPU百分比:\033[32m$cpu_used\033[0m"
echo -e "cpu最近1分钟,5分钟,15分钟的平均负载分别为:\033[32m${load1},${load5},${load15}\033[0m"
echo -e "已使用内存百分比:\033[32m${mem_used}\033[0m"
echo -e "本机总内存容量:\033[32m$swap_total\033[0m,剩余容量:\033[32m$swap_free\033[0m"
echo -e "本机总账户数量为:\033[32m$users\033[0m,当前登录系统的账户数量:\033[32m$login_users\033[0m"
echo -e "占用CPU资源最多的10个进程列表:"
echo -e "\033[32m$top_proc_cpu\033[0m"
echo -e "占用内存资源最多的10个进程列表:"
echo -e "\033[32m$top_proc_mem\033[0m"
echo -e "CPU中断数量:\033[32m$irq\033[0m,CPU上下文切换数量:\033[32m$cs\033[0m"
echo -e "每个磁盘分区的总量与剩余容量如下:"
echo -e "\033[32m$disk\033[0m"
echo -e "\033[32m$tps\033[0m"
echo -e "\033[32m$read_write\033[0m"
echo -e "\033[32m$net_monitor\033[0m"
echo -e "\033[32m-------------------The End---------------------\033[0m"


你可能感兴趣的:(性能,linux,运维,服务器)