技术点:
1.正则提取
sed 用提取变量替换
sed 's/.*toid\=\([0-9]*\).*/\1/g'
2.查找系统占内存最高的10个程序
按照实际物理内存排序:ps aux --sort=-rss
支持 sort 参数,sort 参数 + 表示正序,-表示倒叙 ps aux --sort=-rss,-%cpu
表示先按物理内存再按cpu排列
3.查找系统内各程序占内存最高10个
上面只能看到各个进程的排序,但有时候一个程序可能启动数十个进程,这样子分析起来比较慢了。这里可以先按照 awk程序做过滤后排序输出,sort记得加上 n 参数表示按照数字而不是字符串排序
ps -aux | awk 'NR!=1{a[$11]+=$5;} END {for(item in a) print item " " a[item];}' | sort -rnk2 | head -n 10
4.批量kill进程
kill -9 $(ps -aux | grep 'node /usr/local/bin/pm2 l' | grep -v grep | awk '{print $2}')
附录:
一、sed命令简介
sed 是流文本编辑器,可以用来做流的替换、删除、匹配等操作。
sed简明教程
1. s参数替换
- 文档开头加注释:
sed 's/^/#/g'
- 文档结尾加封号:
sed 's/$/;/g'
2. i参数回写修改流
一般 sed 只将数据修改输出,加上 i 参数可以将改动回写源文件
3. 指定替换范围
s参数前面数字可指定替换行范围
1,s/pattern//g
, 1,2s/pattern//g
, ,2s/pattern//g
- 最后的 g 参数表示替换行内所有匹配项
- 假若需要替换第一个匹配
sed 's/s/S/1' my.txt
- 第二个及以后的匹配
sed 's/s/S/2g' my.txt
4.圆括号
patter段里面由括号括起来的正则表达式匹配内容可以当成变量使用,引用方式: \1 \2 \3
此外还有i a d P N参数
- i 在匹配项前面添加替换内容
- a 在匹配项后面添加内容
- d 放在 g 参数位置,删除匹配行
- n 不显示匹配项,可以减少输出,减少干扰
- p g 参数位置,打印匹配项
二、awk命令简介
AWK命令非常强大,用来做数据统计,不需要写编程脚本,可能awk一行命令就搞定了。
1.内建变量
在写脚本时可以使用一些程序级变量
变量名 | 含义 |
---|---|
$0 | 整行 |
1 -n | 分割后各段的引用 |
NF | 切割后字段数 |
NR | 当前行号,处理的第几行 |
FS | 使用分割符,默认为 tab |
RS | 记录分割符,默认为换行符 |
1.过滤匹配行
- 通过字段逻辑运算进行布尔过滤
如:awk '$3==0 && $6=="LISTEN" ' netstat.txt
中间运算符还有:> >= < <= != ~
, '~' 表示包含 - 输出时携带表头:
awk '$3==0 && $6=="LISTEN" || NR == 1' netstat.txt
- 格式化输出:
awk '$3==0 && $6=="LISTEN" || NR==1 {printf "%-20s %-20s %s\n",$4,$5,$6}' netstat.txt
- 指定分割符:
awk -F:
,多个分割符awk -F '[:,]'
示例:awk '$6 !~ /WAIT/ || NR==1 {print NR,$4,$5,$6}' OFS="\t" netstat.txt
2.拆分文件
有点像mysql的group,要根据第6列不同的数据值拆分文件
awk 'NR!=1{print > $6}' netstat.txt
3.数据统计
awk可以做累加、计数、求合、判断这些基本逻辑
- 输出文件总和:
ls -l | awk '{sum+=$5} END {print sum}'
- 不同进程使用内存大小统计:
ps -aux | awk 'NR!=1{a[$11]+=$5;} END {for(item in a) print item " " a[item]" KB";}'