shell的随记(十 一)

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}' 

猜你喜欢

转载自blog.csdn.net/Nightwish5/article/details/112471760
今日推荐