AWK是一个优良的文本处理工具,Linux及Unix环境中现有的功能最强大的数据处理引擎之一。这种编程及数据操作语言(其名称得自于它的创始人阿尔佛雷德·艾侯、彼得·温伯格和布莱恩·柯林汉姓氏的首个字母)的最大功能取决于一个人所拥有的知识。awk经过改进生成的新的版本nawk,gawk,现在默认linux系统下日常使用的是gawk,用命令可以查看正在应用的awk的来源(ls -l /bin/awk )

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

场景1:

某日,有个客户联系我们说:“门户上发布的中标信息好像被友商窃取了,刚发布一阵就出现在友商网站了”,我们立马去“友商”网站一探究竟,果不其然,一根烟的功夫就跑到友商那里了,这种事客户还是有点介意的,希望我们暂时从技术层面解决一下,如果对方依然“面向监狱编程”,他们就要走法律程序了。

说到这儿我们暂时想了两个方案:

1.假设对方爬虫是遵从robots协议的,那我们就“亮明身份“,通过robots协议告诉它们规矩点,对robots协议感兴趣的可以自己上网络了解,类似于这样:

# 任何端不能爬取我站点的任何内容
User-agent: *
Disallow: /

  

2.通过ip黑名单的方式拒绝爬虫ip访问

这个应该是比较常规的手段了,难点的是如何找到这些ip呢?

  • 在请求日志中过滤UserAgent中带有spider关键字的?事实证明爬虫的伪装能力很强,不会用这么明显的UserAgent

  • 找访问频次比较高的ip呢?统计了一下都很平均

最后通过对比请求参数的方式我找到了过滤规则,正常的请求分页参数pagestr都在合理的范围内,一共600页数据,普通用户翻页不会超过600的,前端已经避免了这种情况,而爬虫发出的请求,pagestr早已超过了600,所以过滤也就比较简单了,找出那些pagestr>600的请求ip就是爬虫了。

看看我们系统配置的access log format

%{client}a - %{dd/MMM/yyyy:HH:mm:ss Z|Asia/Shanghai|zh}t "%r" %s %O %D %{username}C %{traceId}i "%{User-Agent}i"
59.52.50.24 - [23/八月/2021:10:05:34 +0800] "GET /portal/list?chnlcode=bidresult&objtype=&pagestr=200001&pageSize=10 HTTP/1.1" 200 28152 10000 - 2929b398758148738f584c7cf266fa0e "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36"

  

1.grep一级过滤,找出要进行参数截取的请求日志

grep '/portal/list?chnlcode=bidresult' 2021_08_23.request.log
59.52.50.24 - [23/八月/2021:10:05:34 +0800] "GET /portal/list?chnlcode=bidresult&objtype=&pagestr=2&pageSize=10 HTTP/1.1" 200 28152 10000 - 2929b398758148738f584c7cf266fa0e "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36"
59.52.50.24 - [23/八月/2021:10:06:01 +0800] "GET /portal/list?chnlcode=bidresult&objtype=&pagestr=3&pageSize=10 HTTP/1.1" 200 27996 9000 - 13f322d845de4cdc95bd464505a7a202 "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36"

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

grep '/portal/list?chnlcode=bidresult' 2021_08_23.request.log  | awk -F"HTTP/1.1" '{print $1}'
59.52.50.24 - [23/八月/2021:10:05:34 +0800] "GET /portal/list?chnlcode=bidresult&objtype=&pagestr=2&pageSize=10
59.52.50.24 - [23/八月/2021:10:06:01 +0800] "GET /portal/list?chnlcode=bidresult&objtype=&pagestr=3&pageSize=10
grep '/portal/list?chnlcode=bidresult' 2021_08_23.request.log  | awk -F"HTTP/1.1" '{print $1}' | awk -F"pagestr=" '{ print $1,$2}'
59.52.50.24 - [23/八月/2021:10:05:34 +0800] "GET /portal/list?chnlcode=bidresult&objtype=& 20001&pageSize=10
59.52.50.24 - [23/八月/2021:10:06:01 +0800] "GET /portal/list?chnlcode=bidresult&objtype=& 30001&pageSize=10

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过滤请求信息

grep '/portal/list?chnlcode=bidresult' 2021_08_23.request.log  | awk -F"HTTP/1.1" '{print $1}' | awk -F"pagestr=" '{if($2>600) print $1}
59.52.50.24 - [23/八月/2021:10:05:34 +0800] "GET /portal/list?chnlcode=bidresult&objtype=&
59.52.50.24 - [23/八月/2021:10:06:01 +0800] "GET /portal/list?chnlcode=bidresult&objtype=&

这里通过if($2>600)作为判断条件输出$1中的内容,也就是请求信息,也许你会问了,$2不是“2&pageSize=10”这种形式的混合字符串吗,怎么能和数字直接比大小呢?这个就是awk的神奇之处了,这里有个隐式的转换,“自动强制将字符串转为整型。非数字变成0,发现第一个非数字字符,后面自动忽略”。

4.输出请求信息中的ip地址

grep '/portal/list?chnlcode=bidresult' 2021_08_23.request.log  | awk -F"HTTP/1.1" '{print $1}' | awk -F"pagestr=" '{if($2>600) print $1} | sort | uniq -c

  

场景2:

“统计下响应时间超过1s的url”,这个场景算是很常见的了,话不多少,直接上命令,场景1中已经交代了我们系统配置的access log format,其中有一列代表了响应时间,那我们直接用它作为过滤条件即可。

awk '{if($10>1000000) print $1,$2,$8,$9}' 2021_08_23.request.log

这里没有指定-F时默认以“空格”作为分隔符,这个场景下“空格”分隔完就完全够用了。

推荐阅读

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

通过两个场景作为awk的“抛砖”,更多更精彩的玩法网络上已经有很多的案例,我就不啰嗦了。

 

  

抛砖系列之文本处理工具-awk的更多相关文章

  1. 抛砖系列之redis监控命令

    前言 redis是一款非常流行的kv数据库,以高性能著称,其高吞吐.低延迟等特性让广大开发者趋之若鹜,每每看到别人发出的redis故障报告都让我产生一种居安思危,以史为鉴的危机感,恰逢今年十一西安烟雨 ...

  2. 文本处理工具awk

    目录 gawk:模式扫描和处理语言 awk语言 awk工作原理 print awk变量 自定义变量 printf命令 awk操作符 awk的条件判断 awk的循环 awk的数组 awk的函数 awk调 ...

  3. 抛砖系列之git仓库拆分工具git-filter-repo

    最近负责把团队内的git仓库做了一次分拆,解锁一个好用的工具git-filter-repo,给大伙抛砖一波,希望以后遇到类似场景时可以信手拈来. 背景 笔者团队目前是把业务相关的java项目都放到了一 ...

  4. linux 文本分析工具---awk命令(7/1)

    awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各 ...

  5. 抛砖系列之k8s HorizontalPodAutoscaler(HPA)

    前言 "大伙得眼里有活,看见同事忙的时候要互相帮助,这样我们团队才能快速成长,出成绩,多干点活没坏处的,领导都看在眼里记在心里,不会亏待大伙." 看到这也许你还有点懵,不是要讲k8 ...

  6. 文本分析工具awk简单示例

    先创建一个文件:vim hi 取第2个字段和第3个字段: awk '{print $2,$3}' hi     注意{}中的,逗号会在输出的时候转变为空格 加入字符说明: 显示整行: 指定字段分隔符: ...

  7. 文本处理工具-AWK

    awk简介 awk功能与sed相似,都是用来进行文本处理的.awk可以自动地搜索输入文件,并把每一个输入行切分成字段.许多工作都是自动完成的,例如读取每个输入行.字段分割. awk工作原理 awk一次 ...

  8. 抛砖系列之-MySQL中的数据类型JSON

    今天介绍一个MySQL中的数据类型-JSON,相信大家对JSON都不陌生,在日常工作中使用到的频率也很高,话不多说,直接开始. 何谓JSON 看下RFC文档对于JSON的描述 1.基于 JavaScr ...

  9. AWK文本处理工具(Linux)

    AWK文本处理工具(Linux) PS:刚开始实习,就给了个处理百万级别数据的任务,以前学过SHELL的一些东西sed/awk之类的处理,但是也没有具体的应用,只是在10几行10几列的小数据操作过,所 ...

  10. Pyp 替代sed,awk的文本处理工具

    Linux上文本处理工具虽不少,像cut,tr,join,split,paste,sort,uniq,sed,awk这些经典工具让人眼花缭乱,而且都太老了,使用方法都不太人性化,尤其awk,语法简直反 ...

随机推荐

  1. KingbaseES 可更新的视图

    可更新视图 可简化视图可自动更新:系统将允许在视图上使用 INSERT.UPDATE 和 DELETE 语句,就像在常规表上一样.如果视图满足以下所有条件,就是可简化视图,则视图可自动更新: 该视图的 ...

  2. 开源鸿蒙(OpenHarmonyOS)代码下载及编译

    开源鸿蒙的代码仓在码云上,可以通过以下命令下载源码并编译 本机安装虚拟机 如本地已经安装可以忽略此步 安装指导:https://thoughts.teambition.com/share/614c49 ...

  3. 哈希表(HashTable)

    哈希表 哈希表:也叫做散列表.是根据关键字和值(Key-Value)直接进行访问的数据结构.也就是说,它通过关键字 key 和一个映射函数 Hash(key) 计算出对应的值 value,然后把键值对 ...

  4. Zookeeper解决了什么问题?

    在公司中用到了zookeeper协调分布式系统,在这里记录下. (一). 首先是什么? 是一种适用于分布式应用程序的高性能协调服务.它在一个简单的界面中公开常见服务(如命名.配置管理.同步和组服务), ...

  5. Access文件清理占用内存

    1.用access打开access.accdb文件 2.找到数据库工具的压缩和修复数据库,单击就行 3.数据库文件成功便成500K内存占用

  6. #Tarjan,拓扑排序#洛谷 3436 [POI2006]PRO-Professor Szu

    题目 分析 考虑有向图缩点然后拓扑排序, 最恶心的地方是这题有自环, 一旦存在自环就意味着答案一定超过阈值 其实更难过的是Tarjan大小写写错没有发现qwq 代码 #include <cstd ...

  7. nginx使用入门的笔记

    本文于2016年4月底完成,发布在个人博客网站. 考虑个人博客因某种原因无法修复,于是在博客园安家,之前发布的文章逐步搬迁过来. 从源码安装nginx 下载软件 编译nginx,必备pcre,zlib ...

  8. 深入理解 Java 变量类型、声明及应用

    Java 变量 变量是用于存储数据值的容器.在 Java 中,有不同类型的变量,例如: String - 存储文本,例如 "你好".字符串值用双引号引起来. int - 存储整数( ...

  9. C# 方法详解:定义、调用、参数、默认值、返回值、命名参数、方法重载全解析

    C# Methods 方法是一段代码,只有在调用时才会运行. 您可以将数据(称为参数)传递给方法. 方法用于执行某些操作,也被称为函数. 为什么使用方法?为了重用代码:定义一次代码,然后多次使用. 创 ...

  10. HarmonyOS应用性能与功耗云测试

    性能测试 性能测试主要验证HarmonyOS应用在华为真机设备上运行的性能问题,包括启动时长.界面显示.CPU占用和内存占用.具体性能测试项的详细说明请参考性能测试标准. 性能测试支持Phone和TV ...