1.前言
在linux下開發,因為經常需要分析項目的日志檔案,以此來查找軟體功能可能的異常點,經同僚的介紹慢慢接觸了linux下的三大利器:grep,sed,awk,特通過以下例子來總結下自己的學習結果;
2.需求說明
從文本檔案内篩選出起始點坐标和結束點坐标,并将此結果資料構造sql語句,最後使用sql将資料插入到對應表中;
操作步驟大體如下:
a.篩選出坐标資訊;
b.過濾資料:包括删除重複行,去掉異常資料;
c.構造sql語句;
d.導入;
3.實作
a.檔案名為combine.log,其内容如下圖所示

需要将其中的坐标資訊如(2375.40,-25.200),(2375.40,-6.200)資料給篩選出來;
b.篩選出坐标資料,我們先篩選出包含坐标的資料:
$cat combine.log | awk '{ print $6 }' | more
執行以上指令後的結果如下圖所示:
PS:根據觀察a中的資料,可知坐标資料都在第6列裡,通過awk的$6,将這一列資料提出來并輸出到管道,将其作為下一步需要處理的資料來源;
c.利用awk按空格識别列的政策,對資料進行如下處理:
1)将逗号(,)替換為空格,使用sed進行處理;語句如下
$sed 's/\,/\ /g'
2)過濾掉其中重複的行;語句如下:
$awk '!a[$0]++'
3)去掉其中坐标列資料異常值為“-nan”的資料;語句如下:
awk '$3!="-nan" {print $0}'
比對未處理和處理後的資料記錄數:
沒有過濾之前,篩選出的記錄數,如下圖所示:
通過增加篩選條件後的記錄數,如下圖所示:
執行如下篩選語句
cat combine.log | awk '{print $6}' | sed 's/\,/\ /g' | awk '!a[$0]++' | awk '$3!="-nan" {print $0}' | more
結果如下圖所示:
d.擷取坐标資料并進行簡單處理,以便後續構造sql語句;
1)擷取資料,将第3,4列和第9,10列資料篩選出來;
awk '{printf("%s,%s %s,%s\n",$3,$4,$9,$10)}'
2)将坐标拼成形如(x,y)的字元串;
awk '{printf("\"%s\" \"%s\"\n"),$1,$2}'
檢視如下指令檢視篩選後的結果:
cat combine.log | awk '{print $6}' | sed 's/\,/\ /g' | awk '!a[$0]++' | awk '$3!="-nan" {print $0}' |awk '{printf("%s,%s %s,%s\n",$3,$4,$9,$10)}'| awk '{printf("\"%s\" \"%s\"\n"),$1,$2}'| more
資料如下圖所示:
e.構造sql語句,并将結果儲存到檔案;
awk '{printf("insert into dat_reader_path_combine(start_point,end_point) values(%s,%s);\n",$1,$2)}'
執行以下完整語句:
cat combine.log | awk '{print $6}' | sed 's/\,/\ /g' | awk '!a[$0]++' | awk '$3!="-nan" {print $0}' |awk '{printf("%s,%s %s,%s\n",$3,$4,$9,$10)}'| awk '{printf("\"%s\" \"%s\"\n"),$1,$2}'| awk '{printf("insert into dat_reader_path_combine(start_point,end_point) values(%s,%s);\n",$1,$2)}' > combine.sql
檢視conbine.sql的内容,如下圖所示:
使用生成的combine.sql在資料庫内執行後的結果,如下圖所示:
4.總結
a.使用awk可以非常簡答的删除篩選資料内的重複行;
b.使用awk的printf函數将坐标資料組成想要的字元串;
c.使用sed進行字元的查找替換;
d.利用awk按空格分隔資料的方式,進行資料的擷取;
5.測試資料檔案
連結: https://pan.baidu.com/s/1OUjsCGsG0o_8yr8AdxB6_A 提取碼: neym