天天看点

抛砖系列之文本处理工具-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