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. archlinux调整分区及btrfs文件系统大小

    1.防止数据丢失 有重要数据要先备份 最好现在虚拟机练习一下, 2.注意点 修改分区的初始位置似乎需要删除分区后重建分区,意味着分区数据全被删除. 所以修改分区初始位置可能需要其它办法 修改分区的初始 ...

  2. #分治 or 线段树+单调栈#CF526F Pudding Monsters

    题目 给定一个 \(n \times n\) 的棋盘,其中有 \(n\) 个棋子,每行每列恰好有一个棋子. 求有多少个 \(k \times k\) 的子棋盘中恰好有 \(k\) 个棋子. 分析 先将 ...

  3. OpenHarmony 4.1 Release版本正式发布,邀您体验

    春风轻拂的4月,OpenAtom OpenHarmony(以下简称"OpenHarmony")4.1 Release版本如期而至,开发套件同步升级到API 11 Release. ...

  4. SQL HAVING 子句详解:在 GROUP BY 中更灵活的条件筛选

    SQL HAVING子句 HAVING子句被添加到SQL中,因为WHERE关键字不能与聚合函数一起使用. HAVING语法 SELECT column_name(s) FROM table_name ...

  5. Git 11 设置项目提交人

    前面介绍了可以给 Git 设置全局提交人,这样当前电脑所有项目提交人都会变成设置的值. 但实际开发中有时候需要给不同项目设置不同提交人. 比如工作的项目是一个提交人,自己维护的开源项目又是另一个提交人 ...

  6. Python格式化字符串:%、format、f-string

    目前Python格式化字符串的方式有三种: 1. % 2.format 3.f-string % 格式化常用方法: # % 格式化字符串 s1 = 'name is %s' % ('zhangsan' ...

  7. sql注入--基础注入判断方法(构造闭合)

    在我们拿到一个sql注入的题目之后,在确定了注入点之后,接下来要做的事情就是进行基础注入判断. 在开始前,我们需要理解一个SQL注入中最常用的词汇 -- 构造闭合 . 对于SQL处理语句后台的写法: ...

  8. 视频播放测试地址(MP4、M3U8 格式)

    最近在开发视频播放相关的业务功能,开发测试时,需要涉及到 MP4.M3U8 等视频格式. 我每次找测试视频地址时,都要找很久,现在把我在网上收集到的 MP4.M3U8 格式视频地址放在这里,希望帮助到 ...

  9. 在centOS上配置web服务器

    centos,web服务,apache,ftp服务器,mysql,makefile (1). 检查系统是否正常 # more /var/log/messages //检查有无系统内核级错误信息 # d ...

  10. 当年老夫手写的cookie

    前言 留来来只为了回忆,旧博客迁移. 正文 /** * Created by OC on 20xx/8/27. */ function setCookie(name,value,expires,pat ...