亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 1840 | 回復(fù): 6
打印 上一主題 下一主題

[文本處理] 急等awk處理maillog大文件 [復(fù)制鏈接]

論壇徽章:
1
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2017-10-19 18:06 |只看該作者 |倒序?yàn)g覽
CUer,大家好,
我現(xiàn)在遇到一個(gè)問題,就是awk處理3個(gè)G的文件,非常的慢,等很長時(shí)間也沒有結(jié)果。機(jī)器配置挺高的。
我的例子文件只有10000行,awk很快就能檢索出我的需要的數(shù)據(jù)。
但是我們生產(chǎn)環(huán)境的mail log都是幾千萬行級(jí)別的,我是每分鐘需要檢索數(shù)據(jù)來自于上次行號(hào)到這次末行的記錄。

請(qǐng)大家?guī)臀覂?yōu)化一下awk,如果能夠?qū)崿F(xiàn)單行perl也行,我可以嵌套到shell里面。





awk 'BEGIN {sent=0;reject=0} {
                   if (NR>'"$_last_line"' && NR<='"$_current_line"' && $0 ~ /to=.*status=sent/){sent++}
                   else if ($0 ~ /postfix.*reject:/){reject++}
                   };
                   END {printf("Sent Messages: %.1f\n" "Reject Messages: %.1f\n",sent/60,reject/60) }' /var/log/maillog





論壇徽章:
25
程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2016-05-03 06:20:0015-16賽季CBA聯(lián)賽之八一
日期:2018-07-05 10:34:09黑曼巴
日期:2018-07-06 15:19:5015-16賽季CBA聯(lián)賽之佛山
日期:2018-08-03 13:19:3315-16賽季CBA聯(lián)賽之山西
日期:2018-08-07 19:46:2315-16賽季CBA聯(lián)賽之廣夏
日期:2018-08-08 19:31:5015-16賽季CBA聯(lián)賽之青島
日期:2018-11-26 15:21:5015-16賽季CBA聯(lián)賽之上海
日期:2018-12-11 09:45:3219周年集字徽章-年
日期:2020-04-18 23:54:5215-16賽季CBA聯(lián)賽之深圳
日期:2020-04-19 21:40:19黑曼巴
日期:2022-04-03 17:55:1315-16賽季CBA聯(lián)賽之八一
日期:2018-07-03 16:56:46
2 [報(bào)告]
發(fā)表于 2017-10-19 19:13 |只看該作者
awk沒有多少優(yōu)化空間,剛才用你的代碼測試了一個(gè)10M大小、10萬行記錄的maillog只需要1秒,建議你分割一下maillog然后再運(yùn)行代碼。

論壇徽章:
24
申猴
日期:2014-10-10 15:56:39射手座
日期:2014-10-10 15:57:18黑曼巴
日期:2018-05-14 11:05:122016科比退役紀(jì)念章
日期:2018-05-14 11:05:0715-16賽季CBA聯(lián)賽之北控
日期:2018-05-14 11:05:0015-16賽季CBA聯(lián)賽之江蘇
日期:2017-02-27 18:11:0715-16賽季CBA聯(lián)賽之上海
日期:2018-08-15 09:48:5415-16賽季CBA聯(lián)賽之佛山
日期:2018-07-20 17:14:2315-16賽季CBA聯(lián)賽之佛山
日期:2019-09-10 18:08:4615-16賽季CBA聯(lián)賽之山西
日期:2020-03-26 09:40:5115-16賽季CBA聯(lián)賽之佛山
日期:2020-05-08 09:03:54
3 [報(bào)告]
發(fā)表于 2017-10-20 11:06 |只看該作者
本帖最后由 chengchow 于 2017-10-20 11:26 編輯

這個(gè)用tail去做,awk/sed/grep都是將文件全文讀取到內(nèi)存再處理,處理大文件效率非常低下,給你個(gè)我這邊處理日志的腳本,自己去看
思路是,想通過tail從后往前,每次讀取1000行,直到滿足自己要求為止,目前監(jiān)控最后2分鐘日志,最多的一個(gè)項(xiàng)目每次讀取大約50000多行,全文不低于2000W行,3G+,JAVA日志
最后對(duì)已經(jīng)讀取的日志做處理,目前用于生產(chǎn),處理每天幾個(gè)G日志關(guān)鍵詞過濾,基本上抓取下2-3秒,全文抓取20秒以上
  1. #!/usr/bin/env python
  2. #coding:utf-8

  3. """
  4.         log_path:        日志相對(duì)路徑,取gluster[*]之后路徑
  5.         key_value:        日志中出現(xiàn)的關(guān)鍵詞
  6.         point_of_time:        日志時(shí)間點(diǎn),單位(minutes)
  7.         how_many_times:        關(guān)鍵詞出現(xiàn)次數(shù)
  8. """

  9. import os
  10. import sys
  11. import time
  12. #import re

  13. ## 規(guī)范參數(shù)數(shù)量
  14. if len(sys.argv) != 5 :
  15.         print "\nUsage: " + __file__ + " %log_path% %key_value% %point_of_time% %how_many_times%"
  16.         print __doc__
  17.         sys.exit()

  18. ## 定義參數(shù)
  19. LogHome=['/data/logs/gluster1','/data/logs/gluster2','/data/logs/gluster3'] ## 集群路徑,列表模式
  20. ThorldCount=0        ## 關(guān)鍵詞出現(xiàn)次數(shù)初始值
  21. RowCount=1000        ## 每次過濾日志行數(shù)
  22. RowNum=200                ## 總過濾次數(shù)
  23. LogList=[]                ## 設(shè)置一個(gè)空列表給日志路徑

  24. ## 讀取帶入?yún)?shù)
  25. LogFile=sys.argv[1]
  26. KeyWord=sys.argv[2]
  27. DiffMin=sys.argv[3]
  28. KeyWordCountThorld=sys.argv[4]

  29. ## 連接日志路徑
  30. for i in LogHome :
  31.         if os.path.isfile(i + '/' + LogFile) :
  32.                 LogList.append(i + '/' + LogFile)

  33. if len(LogList)==0 :
  34.         print "NULL"
  35.         sys.exit(2)

  36. ## 輪詢處理日志列表
  37. for log in LogList :
  38.         NowTimeStamp=int(time.time())
  39.         OldTimeStamp=int(time.time())-int(DiffMin)*60
  40.         NowTime=time.strftime('%Y-%m-%d %H:%M',time.localtime(NowTimeStamp))
  41.         OldTime=time.strftime('%Y-%m-%d %H:%M',time.localtime(OldTimeStamp))

  42. ## 以RowCount為單位找出需求時(shí)間內(nèi)最短日志
  43.         for num in range(1,RowNum+1) :
  44.                 HeadTime=os.popen('tail -' + str(RowCount*num)  + ' ' + log + ' | awk -F, \'NR==1{print $1}\'').read().strip('\r\n')
  45.                 try:
  46.                         HeadTimeStamp=int(time.mktime(time.strptime(str(HeadTime),'%Y-%m-%d %H:%M:%S')))
  47.                 except:
  48.                         continue
  49.                 if HeadTimeStamp <= OldTimeStamp :
  50.                         break
  51.                 elif num==RowNum :
  52.                         break

  53. ## 找出需求時(shí)間內(nèi)最早日志時(shí)間
  54.         for i in range(1,int(DiffMin)+1) :
  55.                 ReCode=os.system('tail -' + str(RowCount*num)  + ' ' + log + ' | grep -P \'' + OldTime + '\' > /dev/null 2>&1')
  56.                 if ReCode<>0 :
  57.                         OldTimeStamp+=i*60
  58.                         OldTime=time.strftime('%Y-%m-%d %H:%M',time.localtime(OldTimeStamp))
  59.                 else :
  60.                         OldTimeStamp=OldTimeStamp
  61.                         OldTime=time.strftime('%Y-%m-%d %H:%M',time.localtime(OldTimeStamp))
  62.                         break
  63. ## 獲取日志中關(guān)鍵詞出現(xiàn)次數(shù)并自加到ThorldCount
  64.         ThorldCount+=int(os.popen('tail -' + str(RowCount*num)  + ' ' + log + ' | sed -n "/^' + OldTime + '/,/^' + NowTime + '/p" | grep "' + KeyWord + '" | wc -l').read().strip('\r\n'))
  65.                
  66. ## 規(guī)范輸出
  67. if ThorldCount<=int(KeyWordCountThorld) :
  68.         print 'OK --- 關(guān)鍵詞: ' + KeyWord + '; 觸發(fā): ' + str(ThorldCount) + " (次); 讀取日志: " + str(RowCount) + '*' + str(num) + ' (行); 開始時(shí)間: ' + str(OldTime) + '; 結(jié)束時(shí)間: ' + str(NowTime)
  69.         sys.exit(0)
  70. else :
  71.         print 'WARNING --- 關(guān)鍵詞: ' + KeyWord + '; 觸發(fā): ' + str(ThorldCount) + " (次); 讀取日志: " + str(RowCount) + '*' + str(num) + ' (行); 開始時(shí)間: ' + str(OldTime) + '; 結(jié)束時(shí)間: ' + str(NowTime)
  72.         sys.exit(2)
復(fù)制代碼

論壇徽章:
145
技術(shù)圖書徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11獅子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龍
日期:2014-01-08 15:26:12技術(shù)圖書徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
4 [報(bào)告]
發(fā)表于 2017-10-20 11:09 |只看該作者
回復(fù) 1# guobaofu

1. awk 無法解決你的問題
  沒有 file seek function

2. 有file seek function 功能可以
C/C++, Perl, Python,Java,...

3. 其他方法
數(shù)據(jù)庫,分割大文件,...

論壇徽章:
25
程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2016-05-03 06:20:0015-16賽季CBA聯(lián)賽之八一
日期:2018-07-05 10:34:09黑曼巴
日期:2018-07-06 15:19:5015-16賽季CBA聯(lián)賽之佛山
日期:2018-08-03 13:19:3315-16賽季CBA聯(lián)賽之山西
日期:2018-08-07 19:46:2315-16賽季CBA聯(lián)賽之廣夏
日期:2018-08-08 19:31:5015-16賽季CBA聯(lián)賽之青島
日期:2018-11-26 15:21:5015-16賽季CBA聯(lián)賽之上海
日期:2018-12-11 09:45:3219周年集字徽章-年
日期:2020-04-18 23:54:5215-16賽季CBA聯(lián)賽之深圳
日期:2020-04-19 21:40:19黑曼巴
日期:2022-04-03 17:55:1315-16賽季CBA聯(lián)賽之八一
日期:2018-07-03 16:56:46
5 [報(bào)告]
發(fā)表于 2017-10-20 11:45 |只看該作者
回復(fù) 1# guobaofu



用tail把maillog中的從第${_last_line}行到最后一行的記錄重定向到新文件1.tmp,再用awk處理1.tmp:
  1. tail -n +${_last_line}  /var/log/maillog > 1.tmp
  2. awk 'BEGIN{sent=0;reject=0}/to=.*status=sent/{sent++}/postfix.*reject:/{reject++};END{printf("Sent Messages: %.1f\nReject Messages: %.1f\n",sent/60,reject/60)}' 1.tmp
復(fù)制代碼

論壇徽章:
0
6 [報(bào)告]
發(fā)表于 2017-10-20 12:31 |只看該作者
提示: 作者被禁止或刪除 內(nèi)容自動(dòng)屏蔽

論壇徽章:
1
7 [報(bào)告]
發(fā)表于 2017-10-20 15:34 |只看該作者
謝謝各位大神的幫助~~
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP