awk處理字符串方法匯總


說明

本篇記錄一些字符串的處理方法,這里不具體講完整的方法,只記錄遇到的需要處理的情況

用例

用例一:解析ceph.log的ops

由於ops的單位是有的帶k的有的不帶k的,那么需要匹配處理

字符串示例:

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
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:解析非固定字段

我們先看下我們的例子

[root@lab101 data]# cat test.txt
100 100k 100
200 200 200k

假如是上面的字段,我們不確定K出現在哪里,但是需要取得這行的值,那么就需要遍歷行進行獲取了,解析的方法如下

[root@lab101 data]# cat test.txt |awk '{for(i=1;i<=NF;i++){if($i~/k/){$1=$i;print $0}}}'
100k 100k 100
200k 200 200k

上面的例子是遍歷列,我們取到了后,把值賦給變量$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的讀寫數據

# /bin/sh

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM