抛砖系列之文本处理工具-awk

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的更多相关文章
- 抛砖系列之redis监控命令
前言 redis是一款非常流行的kv数据库,以高性能著称,其高吞吐.低延迟等特性让广大开发者趋之若鹜,每每看到别人发出的redis故障报告都让我产生一种居安思危,以史为鉴的危机感,恰逢今年十一西安烟雨 ...
- 文本处理工具awk
目录 gawk:模式扫描和处理语言 awk语言 awk工作原理 print awk变量 自定义变量 printf命令 awk操作符 awk的条件判断 awk的循环 awk的数组 awk的函数 awk调 ...
- 抛砖系列之git仓库拆分工具git-filter-repo
最近负责把团队内的git仓库做了一次分拆,解锁一个好用的工具git-filter-repo,给大伙抛砖一波,希望以后遇到类似场景时可以信手拈来. 背景 笔者团队目前是把业务相关的java项目都放到了一 ...
- linux 文本分析工具---awk命令(7/1)
awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各 ...
- 抛砖系列之k8s HorizontalPodAutoscaler(HPA)
前言 "大伙得眼里有活,看见同事忙的时候要互相帮助,这样我们团队才能快速成长,出成绩,多干点活没坏处的,领导都看在眼里记在心里,不会亏待大伙." 看到这也许你还有点懵,不是要讲k8 ...
- 文本分析工具awk简单示例
先创建一个文件:vim hi 取第2个字段和第3个字段: awk '{print $2,$3}' hi 注意{}中的,逗号会在输出的时候转变为空格 加入字符说明: 显示整行: 指定字段分隔符: ...
- 文本处理工具-AWK
awk简介 awk功能与sed相似,都是用来进行文本处理的.awk可以自动地搜索输入文件,并把每一个输入行切分成字段.许多工作都是自动完成的,例如读取每个输入行.字段分割. awk工作原理 awk一次 ...
- 抛砖系列之-MySQL中的数据类型JSON
今天介绍一个MySQL中的数据类型-JSON,相信大家对JSON都不陌生,在日常工作中使用到的频率也很高,话不多说,直接开始. 何谓JSON 看下RFC文档对于JSON的描述 1.基于 JavaScr ...
- AWK文本处理工具(Linux)
AWK文本处理工具(Linux) PS:刚开始实习,就给了个处理百万级别数据的任务,以前学过SHELL的一些东西sed/awk之类的处理,但是也没有具体的应用,只是在10几行10几列的小数据操作过,所 ...
- Pyp 替代sed,awk的文本处理工具
Linux上文本处理工具虽不少,像cut,tr,join,split,paste,sort,uniq,sed,awk这些经典工具让人眼花缭乱,而且都太老了,使用方法都不太人性化,尤其awk,语法简直反 ...
随机推荐
- archlinux调整分区及btrfs文件系统大小
1.防止数据丢失 有重要数据要先备份 最好现在虚拟机练习一下, 2.注意点 修改分区的初始位置似乎需要删除分区后重建分区,意味着分区数据全被删除. 所以修改分区初始位置可能需要其它办法 修改分区的初始 ...
- #分治 or 线段树+单调栈#CF526F Pudding Monsters
题目 给定一个 \(n \times n\) 的棋盘,其中有 \(n\) 个棋子,每行每列恰好有一个棋子. 求有多少个 \(k \times k\) 的子棋盘中恰好有 \(k\) 个棋子. 分析 先将 ...
- OpenHarmony 4.1 Release版本正式发布,邀您体验
春风轻拂的4月,OpenAtom OpenHarmony(以下简称"OpenHarmony")4.1 Release版本如期而至,开发套件同步升级到API 11 Release. ...
- SQL HAVING 子句详解:在 GROUP BY 中更灵活的条件筛选
SQL HAVING子句 HAVING子句被添加到SQL中,因为WHERE关键字不能与聚合函数一起使用. HAVING语法 SELECT column_name(s) FROM table_name ...
- Git 11 设置项目提交人
前面介绍了可以给 Git 设置全局提交人,这样当前电脑所有项目提交人都会变成设置的值. 但实际开发中有时候需要给不同项目设置不同提交人. 比如工作的项目是一个提交人,自己维护的开源项目又是另一个提交人 ...
- Python格式化字符串:%、format、f-string
目前Python格式化字符串的方式有三种: 1. % 2.format 3.f-string % 格式化常用方法: # % 格式化字符串 s1 = 'name is %s' % ('zhangsan' ...
- sql注入--基础注入判断方法(构造闭合)
在我们拿到一个sql注入的题目之后,在确定了注入点之后,接下来要做的事情就是进行基础注入判断. 在开始前,我们需要理解一个SQL注入中最常用的词汇 -- 构造闭合 . 对于SQL处理语句后台的写法: ...
- 视频播放测试地址(MP4、M3U8 格式)
最近在开发视频播放相关的业务功能,开发测试时,需要涉及到 MP4.M3U8 等视频格式. 我每次找测试视频地址时,都要找很久,现在把我在网上收集到的 MP4.M3U8 格式视频地址放在这里,希望帮助到 ...
- 在centOS上配置web服务器
centos,web服务,apache,ftp服务器,mysql,makefile (1). 检查系统是否正常 # more /var/log/messages //检查有无系统内核级错误信息 # d ...
- 当年老夫手写的cookie
前言 留来来只为了回忆,旧博客迁移. 正文 /** * Created by OC on 20xx/8/27. */ function setCookie(name,value,expires,pat ...