抛磚系列之文本處理工具-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的“抛磚”,更多更精彩的玩法網絡上已經有很多的案例,我就不啰嗦了。