天天看點

抛磚系列之文本處理工具-awk

抛磚系列之文本處理工具-awk

抛磚系列之文本處理工具-awk

AWK是一個優良的文本處理工具,Linux及Unix環境中現有的功能最強大的資料處理引擎之一。這種程式設計及資料操作語言(其名稱得自于它的創始人阿爾佛雷德·艾侯、彼得·溫伯格和布萊恩·柯林漢姓氏的首個字母)的最大功能取決于一個人所擁有的知識。awk經過改進生成的新的版本nawk,gawk,現在預設linux系統下日常使用的是gawk,用指令可以檢視正在應用的awk的來源(ls -l /bin/awk )

​以上内容來源于百度百科

場景1:

某日,有個客戶聯系我們說:“門戶上釋出的中标資訊好像被友商竊取了,剛釋出一陣就出現在友商網站了”,我們立馬去“友商”網站一探究竟,果不其然,一根煙的功夫就跑到友商那裡了,這種事客戶還是有點介意的,希望我們暫時從技術層面解決一下,如果對方依然“面向監獄程式設計”,他們就要走法律程式了。

說到這兒我們暫時想了兩個方案:

1.假設對方爬蟲是遵從robots協定的,那我們就“亮明身份“,通過robots協定告訴它們規矩點,對robots協定感興趣的可以自己上網絡了解,類似于這樣:

  

2.通過ip黑名單的方式拒絕爬蟲ip通路

這個應該是比較正常的手段了,難點的是如何找到這些ip呢?

在請求日志中過濾UserAgent中帶有spider關鍵字的?事實證明爬蟲的僞裝能力很強,不會用這麼明顯的UserAgent;

找通路頻次比較高的ip呢?統計了一下都很平均;

最後通過對比請求參數的方式我找到了過濾規則,正常的請求分頁參數pagestr都在合理的範圍内,一共600頁資料,普通使用者翻頁不會超過600的,前端已經避免了這種情況,而爬蟲發出的請求,pagestr早已超過了600,是以過濾也就比較簡單了,找出那些pagestr>600的請求ip就是爬蟲了。

看看我們系統配置的access log format

1.grep一級過濾,找出要進行參數截取的請求日志

2.一步一步把pagestr截取出來

awk -F 通過指定分隔符拆分字元串,相當于java中split。

截止現在我們拿到了”pagestr=“作為分隔符的左右兩側的值,分别是:

左側

59.52.50.24 - [23/八月/2021:10:05:34 +0800] "GET /portal/list?chnlcode=bidresult&objtype=&

右側

2&pageSize=10

左側有我們需要的ip(59.52.50.24),右側有我們需要的pagestr(2),隻是pagestr現在和其他參數黏在一起(2&pageSize=10),似乎不能直接拿來用。

3.通過pagestr過濾請求資訊

這裡通過if($2>600)作為判斷條件輸出$1中的内容,也就是請求資訊,也許你會問了,$2不是“2&pageSize=10”這種形式的混合字元串嗎,怎麼能和數字直接比大小呢?這個就是awk的神奇之處了,這裡有個隐式的轉換,“自動強制将字元串轉為整型。非數字變成0,發現第一個非數字字元,後面自動忽略”。

4.輸出請求資訊中的ip位址

場景2:

“統計下響應時間超過1s的url”,這個場景算是很常見的了,話不多少,直接上指令,場景1中已經交代了我們系統配置的access log format,其中有一列代表了響應時間,那我們直接用它作為過濾條件即可。

這裡沒有指定-F時預設以“空格”作為分隔符,這個場景下“空格”分隔完就完全夠用了。

推薦閱讀

https://linuxhandbook.com/awk-command-tutorial/

通過兩個場景作為awk的“抛磚”,更多更精彩的玩法網絡上已經有很多的案例,我就不啰嗦了。

 

抛磚系列之文本處理工具-awk