awk神器


 
 
  產品經理(PM)過來找你要最近某某的數據,而你知道這些數據目前只能通過日志文件去分析,因為我們知道,我們不可能把所有數據都放入db中(這不科學啊!)。每當有這樣任務的時候,你就用php或java(又或c)寫一個特殊任務的程序,這真是一件令人頭痛的事情。
 
 
  
  
放入db???
 

  為什么我不建議把數據放入db中呢?優點不言自明,我們可以通過sql語句很容易把數據拿出來。

  缺點呢?首先就是我們不能把什么東西都往db里放?

  原因,我歸納了以下幾點:
  1、數據的抽風型:
    一般都是某某(不敢指明點姓,怕打擊報復)腦門子一拍,突然想要某些數據,這就會來找你要。等這股抽風勁一過,很長時間沒人再找你要數據了。
  2、數據的臃腫型:
    與其說是臃腫還不如說是亂七八糟。你不能把那一坨一坨的雜七雜八的數據,一股腦放入db中吧?那你的后台db成什么樣子了?所以我們要管好我們的后院,不能什么東西都放到家里面。
  3、成本:
    干什么事情,我們不能做賠本的買賣。像這種一次性的買賣,我們就要降低成本去做。
 
  為了解決以上問題,我們請出awk神器吧?一種“短小精悍”的神器,常常用一兩行代碼就能搞定一些復雜的任務。
 
 
 

本文宗旨
 
  awk不難,關鍵是看我們怎么思考?我的思考方式是:在這么多數據行中,我要找什么(行位置)?找到之后,我們要干什么(如{})?
  故我的主題就出來了:找什么和干什么。我不想講什么語法之類的東西(不要在意這些細節)。
 
 
 

找什么?
 
   這個世界最難的不是做什么,而是找什么?李清照的“尋尋覓覓”,最后把自己尋覓沒了。仿古人,俺也尋尋覓覓了一陣子,結果跟清照大姐一樣,迷失在尋尋覓覓中,到現在都不知道我在尋覓什么?——個人認為找什么不是體力活,而是技術活。awk吸引我的,也就是它教會了我怎么找我想要的東西?
 
 准備干糧
  
cat  netstat.txt 
Proto Recv-Q Send-Q Local-Address          Foreign-Address             State
tcp        0      0 0.0.0.0:3306           0.0.0.0:*                   LISTEN
tcp        1      1 0.0.0.0:80             0.0.0.0:*                   LISTEN
tcp        0      0 127.0.0.1:9000         0.0.0.0:*                   LISTEN
tcp        0      0 yuedu.com:80        124.205.5.146:18245         TIME_WAIT
tcp        0      0 yuedu.com:80        61.140.101.185:37538        FIN_WAIT2
tcp        0      0 yuedu.com:80        110.194.134.189:1032        ESTABLISHED
tcp        0      0 yuedu.com:80        123.169.124.111:49809       ESTABLISHED
tcp        0      0 yuedu.com:80        116.234.127.77:11502        FIN_WAIT2
tcp        0      0 yuedu.com:80        123.169.124.111:49829       ESTABLISHED
tcp        0      0 yuedu.com:80        183.60.215.36:36970         TIME_WAIT
tcp        0   4166 yuedu.com:80        61.148.242.38:30901         ESTABLISHED
tcp        0      1 yuedu.com:80        124.152.181.209:26825       FIN_WAIT1
tcp        0      0 yuedu.com:80        110.194.134.189:4796        ESTABLISHED
tcp        0      0 yuedu.com:80        183.60.212.163:51082        TIME_WAIT
tcp        0      1 yuedu.com:80        208.115.113.92:50601        LAST_ACK
tcp        0      0 yuedu.com:80        123.169.124.111:49840       ESTABLISHED
tcp        0      0 yuedu.com:80        117.136.20.85:50025         FIN_WAIT2
tcp        0      0 :::22                  :::*                        LISTEN

 

 
 上小菜(基礎條件匹配):

 查詢所有tcp中,接受隊列非0的網絡包。

localhost:zhoubc Guest$ awk '$1 =="tcp" && $2 > 0' netstat.txt 
tcp        1      1 0.0.0.0:80             0.0.0.0:*                   LISTEN

 打印出來的內容,我們不知所雲。如果把第一行打出來,就一目了然了。這時候我們要用到awk的全局常量(如果想知道AWK的全局常量,我們可以往下看,附錄,我把常用的羅列出來了)NR。

localhost:zhoubc Guest$ awk 'NR==1 || $1 =="tcp" && $2 > 0' netstat.txt 
Proto Recv-Q Send-Q Local-Address          Foreign-Address             State
tcp        1      1 0.0.0.0:80             0.0.0.0:*                   LISTEN

看爽了是不是?

推薦
 
 
 
參考資料
 
不錯的博客文章:
http://bbs.linuxtone.org/thread-24441-1-1.html
手冊:http://www.gnu.org/software/gawk/manual/gawk.html
 


免責聲明!

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



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