说明
本篇记录一些字符串的处理方法,这里不具体讲完整的方法,只记录遇到的需要处理的情况
用例
用例一:解析ceph.log的ops
由于ops的单位是有的带k的有的不带k的,那么需要匹配处理
字符串示例:
1
| 2021-01-13 11:09:55.664479 mgr.node103 client.994548 172.168.30.103:0/265828031 659839 : cluster [DBG] pgmap v218541: 6976 pgs: 6976 active+clean; 178TiB data, 358TiB used, 370TiB / 728TiB avail; 11.4MiB/s rd, 163MiB/s wr, 1.98kop/s
|
1 2 3 4 5 6 7 8 9 10 11
| cat ceph-20210113 |grep -v noout|awk '{gsub("op/s","",$28); print $1,$2,$28}'|awk '{if($3~/k/) {gsub("k","",$3); print $1,$2","$3*1000} else {print $1,$2","$3}}'
2021-01-13 11:09:39.575349 928 2021-01-13 11:09:41.585060 919 2021-01-13 11:09:43.598471 1010 2021-01-13 11:09:45.608886 1040 2021-01-13 11:09:47.620040 1240 2021-01-13 11:09:49.630839 1460 2021-01-13 11:09:51.640537 1520 2021-01-13 11:09:53.654024 1860 2021-01-13 11:09:55.664479 1980
|
语法说明:
通过gsub(“op/s”,””,$28)去掉所有的op/s字段
通过判断是否有k,有的话去掉k,并且把这个字段的转换成真实io,没有问题的就不转换
用例2:解析非固定字段
我们先看下我们的例子
1 2 3
| [root@lab101 data] 100 100k 100 200 200 200k
|
假如是上面的字段,我们不确定K出现在哪里,但是需要取得这行的值,那么就需要遍历行进行获取了,解析的方法如下
1 2 3
| [root@lab101 data] 100k 100k 100 200k 200 200k
|
上面的例子是遍历列,我们取到了后,把值赋给变量$1的位子,整个适用于变量比较长,但是中间存在空变量的情况,也就是上面例子一当中,处于迁移状态的情况,做上面的例子一的时候解析的时候没考虑迁移的时候,字段长度发生了变化,我们重新解析一次日志
1
| cat ceph.log |awk '{for(i=1;i<=NF;i++){if($i~/op\/s/){$3=$i;print $1,$2,$3}}}'|awk '{gsub("op/s","",$3); print $1,$2,$3}'|awk '{if($3~/k/) {gsub("k","",$3); print $1,$2","$3*1000} else {print $1,$2","$3}}'
|
这次的解析的方法是先判断是否有op/s的,有的话放在$3的变量的位置,然后后面再处理掉op/s字段,然后根据是否有k进行转换
用例三:解析ceph.log的读写数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
|
cat vcfs-rd-wr.log |awk ' {if($0~"wr") { for(i=1;i<=NF;i++) {if($i~/rd/) { $3=$(i-2); $4=$(i-1); } else if($i~/wr/) { $5=$(i-2); $6=$(i-1); } } print $1,$2,$3,$4,$5,$6; }
else { for(i=1;i<=NF;i++) { if($i~/rd/) { $3=$(i-2); $4=$(i-1); } } print $1,$2,$3,$4,"0","kB/s" } #print $0 }'|awk ' {if($4=="kB/s") { $3=$3*1 } else if($4=="MB/s") { gsub("MB/s","kB/s",$4) $3=$3*1024 } else if($4=="GB/s") { gsub("GB/s","kB/s",$4) $3=$3*1024*1024 } if($6=="B/s") { gsub("B/s","kB/s",$6) $5=$5/1024 } else if($6=="kB/s") { $5=$5 } else if($6=="MB/s") { gsub("MB/s","kB/s",$6) $5=$5*1024 } else if($6=="GB/s") { gsub("GB/s","kB/s",$6) $5=$5*1024*1024 }
print $0 }'
|