1、需求, ps -ef | grep tomcat | grep -v grep | wc -l 的结果 更换k8s-master文件中的 linux{name=“tomcat”}旁边的 6
#应用指标 linux app
linux{name="tomcat"} 910999999
linux{name="nginx"} 3
#linux Server metrics
linux{name="内存"} 44
linux{name="磁盘"}65
linux{name="网络"} 16
linux{name="cpu"} 15
#主机在线
#系统访问量
linux{name="app_number"} 876
linux{name="主机"} 1
方法1:
#有局限性10,100,多位数的话只是会追加,不会替换。 需再次调整正则的匹配
sed -i '/^linux.*tomcat/{s/^\(linux.*tomcat.* \)[0-9]$/\1/;h;s/^.*$/ps -ef | grep tomcat | grep -v grep | wc -l/e;H;x;s/\n//}' k8s-master
方法2 Perl处理(推荐使用):
perl -pe"s#tomcat\S+\s+\K\d+#`pgrep -c tomcat`#" file
perl -pe"s#tomcat\D+\K\d+#`pgrep -c tomcat`#" k8s-master
perl -pe"s#tomcat\W+\K\d+#`pgrep -c tomcat`#" k8s-master
方法3 函数
#!/bin/bash
tomcat(){
a=`grep tomcat k8s-master`
b=`grep tomcat k8s-master | awk '{print $1}' `
c=`ps -ef | grep tomcat|grep -v grep | wc -l`
d=$b" "$c
#注意下面的要用双引号, 如果用单引号,变量在单引号里是不会扩展的
sed -i "s/$a/$d/g" /root/k8s-master
}
tomcat
3、如何在下面的log里面,把丢包的时间段批次找出来,一般是1秒一个包,我想把类似上面圈中的过滤出来。
(列出前后两行数字相减后,差大于1的数据)
伪代码思路:
if a[i]-a[i-1] -gt 1 then
echo a[i], a[i-1]
i的初始值是 第二个元素的下标。
冒号替换为空, 然后前后相减,超过你规定的时长4秒,那就说是丢包(此想法有BUG),
改成将时间转换为总秒数后再做相减。不然 00:59 和 01:00相差一秒的, 这种“进位”结果会被列出来。
但效率有待提高,匹配给的23000行数据,要执行一段时间才出数据
#生成ping.log日志
while true; do ping -c 1 192.168.1.254 | awk '{print "["strftime("%F %H:%M:%S")"]:"$0}' |grep from >> ping.log;sleep 1; done &
#!/bin/bash
limitNum=4
fileLineNum=`cat ping.log | wc -l`
#arra=(`sed -r "s#:##g" ping.log | awk -F "[\] +]" '{print $2}' | xargs -n 1`) 最初的想法但有BUG
arra=(`awk -F "[][ +]" '{print $2,$3}' ping.log | xargs -I {} date +%s -d '{}'`)
for((i=1;i<=$fileLineNum;i++));
do
((result=${arra[i]}-${arra[i-1]}))
if [[ $result -gt $limitNum ]];then
((afterNum=$i+1))
awk -v n=$i 'NR==n{print $0}' ping.log
awk -v n1=$afterNum 'NR==n1{print $0}' ping.log
echo -e "---------\n"
fi
done
结果图:
Steven大佬的perl解法:
#问:以秒为单位,查找时间上不连续的相邻行,以下文本的时间只是一个参考,并不知道在哪里断开了,现在要查找这样的相邻行
perl -F: -ane'$l&&$F[0]*3600+$F[1]*60+$F[2]-1>$l&&print"$n$_";$l=$F[0]*3600+$F[1]*60+$F[2];$n=$_' time.log
#如果找出时间上不连续的相邻行并且(不连续的相邻行间)差值超过n秒才输出,n可以为3,4,5
perl -F: -ane'$l&&$l+3<$F[0]*3600+$F[1]*60+$F[2]&&print"$n$_";$l=$F[0]*3600+$F[1]*60+$F[2];$n=$_' time.log
这里就是4秒及以上才列出,改那个数字就行了。3秒就是+2,以此类推
4、筛选 ip link的网卡状态
效果:
#1 perl 大佬给的操作
ip l|perl -nE'say"$1\t$2" while/(\S+): <.*state (\S+)/g'
#2 sed N模式空间,\S匹配任意不是空白符的字符 和 分组
ip l|sed -r 'N;s#[0-9]+: (\S+): <.*state (\S+).*#\1\t\2#'
参考:
https://www.cnblogs.com/fhefh/archive/2011/11/14/2248942.html 《sed基础》
https://www.cnblogs.com/meitian/p/5307900.html 《sed高级命令之n、N》
5、文本处理: 奇偶列颠倒顺序 ,数据如下:
22 张三 19 李四 28 王六
35 刘七 29 王军
18 伊丽 24 刘强 25 张帅 31 刘明 成功
变成
张三 22 李四 19 王六 28
刘七 35 王军 29
伊丽 18 刘强 24 张帅 25 刘明 31 成功
方法1 sed 分组
sed -r 's/(\S+) (\S+)/\2 \1/g' test.txt
方法2 perl
perl -anE 'for($i=0;$i<=$#F;$i+=2){($F[$i],$F[$i+1])=($F[$i+1],$F[$i])}say "@F"'
perl -anE 'for($i=0;$i<=$#F-1;$i+=2){($F[$i],$F[$i+1])=($F[$i+1],$F[$i])}say "@F"'
6、匹配最后一个content到rev的内容 正则怎么写
alert udp any 53 -> any any (msg:\"Backdoor.DNS.BEACON.[CSBundle DNS]\"; content:\"|00 01 00 01|\"; offset:4; depth:4; content:\"|0a|_domainkey\"; distance:0; content:\"|00 00 10 00 01 c0 0c 00 10 00 01 00 00 00 02 01 00 ff|v=DKIM1\; p=\"; distance:0; sid:25872; rev:1;)
#1、
(content)(?!.*\1).*(?=rev)
#2、
content((?!content).)*rev
------分割线--------
匹配第一个时间,Sep 23 11:24:53
Sep 23 11:24:53 172.20.2.76 Sep 23 11:24:53 localhost waf: tag:waf_log_websec site_id:1561516391 protect_id:2575966601 dst_ip:172.20.111.31 dst_port:8443 src_ip:203.208.60.126 src_port:4870 method:GET domain:mpaytech.lianlianpay.com uri:/.well%2dknown/assetlinks.json alertlevel:HIGH
#匹配第一个时间
^(\S+ \S+ ([\d]{2}:){2}[\d]{2})
#匹配最后一个时间
(\S+ \S+ ([\d]{2}:){2}[\d]{2})(?!.*\1)
7、统计每个单词次数
来源于牛客网题目
welcome nowcoder
welcome to nowcoder
nowcoder
#1
cat nowcoder.txt | tr -s ' ' '\n' |sort |uniq -c|sort |awk '{print $2" "$1}'
#2
awk '{for(i=1;i<=NF;i++)uid[$i]++}END{for( item in uid) {print item,uid[item]}}' nowcoder.txt
统计内存总和
ps aux | grep -v 'RSS TTY' |
#统计内存总和
ps aux | awk '{a+=$6}END{print a}'