聊聊AWK命令的那些事
- 切割文件
- 内置变量的使用
- 正则匹配
- 类sql功能
作为一个大数据开发,先来一个我比较喜欢的面试题。
对于下面的nginx日志access.log,用脚本分析出访问ip的Top 10。 其实这个题不难,但是考察了几个常用的shell 命令,awk、uniq、sort、head,我觉得对于做大数据开发、运维、数仓等来说都是应该必备的。
2018-11-20T23:37:40+08:00 119.15.90.30 - "GET /free.php?proxy=out_hp&sort=&page=1 HTTP/1.1" "/free.php" - 200 0.156 362 6849/7213 TLSv1.2 ECDHE-RSA-AES128-GCM-SHA256 - - - "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 732; .NET4.0C; .NET4.0E; LBBROWSER)"
2018-11-20T23:37:44+08:00 117.30.95.62 - "GET /partner.php HTTP/1.1" "/partner.php" - 200 0.016 457 6534/6956 TLSv1.2 ECDHE-RSA-AES128-GCM-SHA256 - https://blog.csdn.net/ithomer/article/details/6566739 - "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36"
2018-11-20T23:37:44+08:00 117.30.95.62 - "GET /css/bootstrap.min.css HTTP/1.1" "/css/bootstrap.min.css" - 200 0.045 398 19402/19757 TLSv1.2 ECDHE-RSA-AES128-GCM-SHA256 - https://proxy.mimvp.com/partner.php - "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36"
2018-11-20T23:37:44+08:00 117.30.95.62 - "GET /css/hint.min.css HTTP/1.1" "/css/hint.min.css" - 200 0.000 393 1635/1989 TLSv1.2 ECDHE-RSA-AES128-GCM-SHA256 - https://proxy.mimvp.com/partner.php - "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36"
来上答案
cat access.log | awk '{print $2}'| uniq -c | sort -k1 -nr| head -10
其实这个问题还有很多变种,比如除了脚本,用你最熟悉的语言写出来,还有如果文件过大,超过了内存限制,怎么处理。不过这些都是题外话了,我们今天主要讲一下awk在工作中的一些简单的应用。
其实awk的功能非常强大,不过今天我们主要来讲讲在我们的工作中比较常用的awk用法。
awk '{[pattern] action}' {filenames}
切割文件
-F 指定拆分文件的分隔符,默认是空格或者 t 比如上面的日志我们想获取第二列的ip地址,我们可以这样写
awk -F ' ' '{print $2}' access.log
空格我们是可以不用写的,我这里写出来做一个示范。
其实还有一种特殊字符,比如hive中默认分隔符是0x01,这种的使用awk怎么写呢?
awk -F '\001' '{ print $1 }' abcd.txt
内置变量的使用
- $0 用于打印出整行的字段.
- $n 由 -F 参数指定的分隔符切割之后,$n用于打印出来第几个字段,索引从1开始
- NF 每行数据切分之后,有多少列,比如我们可以用print $NF 来打印出最后一列
有一些时候我们可以用awk 截取其中的某几个字段拼接出来我们想要的一些语句。 比如我们想截取上面access.log里面的ip字段,然后生成一些sql,插入到数据库。
awk '{print "insert into mytable(ip) values('''"$2"''');"}' access.log > /tmp/ip.sql
有人会问,这种场景一般什么时候会用呢,比如你有一万条或者更多的数据,你完全可以写一个sql来插入,但是如果是数量太多的话,一次性写入太多数据,会导致锁表,这个时候其他人就没法插入了,如果是线上的生产环境就更不允许了,所以对于一些类似的操作,我们可以拆分出多个sql来一个个的执行,这样单个sql锁表的时间就会减少,避免长时间锁表带来的数据库不可用。
正则匹配
有时候我们只想打印出来一些我们想要的列,我们可以通过正则匹配来做。
比如我们想打印出来上面的access.log中117开头的ip,可以这样做.
awk '$2 ~ /^117/ {print $2}' access.log
类sql功能
其实awk还可以帮我们实现一些简单的类似sql的功能,我们也简单说一下。
比如我们有一个下面的学生表
id 班级 姓名 id class name
1 1班 张三 2 2班 李四 3 1班 王五 4 3班 赵六
比如我们想统计每个班级有多少同学,可以使用如下命令
awk '{a[$2]++} END {for(i in a){print i"人数 : "a[i]}}' student.txt
我们定义了一个类似map的变量a,key是班级名称,也就是第二列,value值是每个班级对应的人数,最后通过一个for循环输出。
其实awk还有非常多、非常强大的功能,但是对于我们工作中我觉得用处并不大,这里就不着重介绍了,感兴趣的朋友可以网上找一些相关的资料。
- Docker系列教程05-容器常用命令
- 数据分析利器-NumPy
- 【LEETCODE】模拟面试-134-Gas Station
- Docker系列教程17-默认bridge网络中配置DNS
- Docker系列教程16-network命令
- 【LEETCODE】模拟面试-206. Reverse Linked List
- Eslint检测出的问题如何自动修复
- 【LEETCODE】模拟面试-215. Kth Largest Element in an Array
- Docker系列教程15-Docker容器网络
- 数据挖掘
- Docker系列教程14-Docker数据持久化
- Docker 学习系列二之基本管理
- Docker系列教程13-Docker可视化管理工具
- Ubuntu 16.04 安装VNC
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 聊聊怎样学习Binder
- ggplot2_散点图
- 你真的理解Binder“一次拷贝“吗?
- ggplot2_boxplot
- ggplot_Violin Plot & dot plot
- 只要网速够快,小视频看完一个删一个,任性!Python爬取小视频
- ggplot barplot and error bars
- 设计稿生成游戏界面
- ggplot Stripchart and line
- ggplot2 核密度图和直方图
- 喜欢的歌曲不在一个平台怎么办?你需要一个自己专属的音乐播放器
- ggplot_QQ图和ECDF
- tidyverse evaluation
- 下载歌曲的时候嫌麻烦?打造专属你的音乐下载器
- Tidyverse补充