linux命令-awk入门
最近经常查看nginx日志,有时候需要做一些统计分析,于是就想起了awk,学习了就顺便做一个记录。
目录
- 概述:简单介绍awk背景原理
- 基本用法:常用到的awk语法
- 内建变量
- 综合实例
概述
awk是创始人Aho, Kernighan and Weinberger的首字母简写,是一个基于列的流处理工具,在功能上是sed和grep的组合版,但不仅限于此,awk本身就是一种编程语言。awk依次读入每一行(默认按行分割,可以指定记录的分隔符),然后根据分隔符(默认是空白,一个或者多个空格、tab)把该行划分为若干个域,每个域依次命名为$1,$2...,$0表示一整行
基本用法
awk既可以在命令行直接使用,也可以以脚本的形式使用(当时用复杂的语句的时候)
# 使用命令行
awk [-F value] 'program text' [file ...]
# 使用脚本文件
awk [-F value] [-f program-file] [--] [file ...]
由于暂时的应用比较简单就直接使用命令行。
- 'program text':表示awk语句,格式为"Pattern { ACTIONS; }",其中patern就是正则表达式,action就是对于前面匹配文本的操作,比如print
- -F:上面说了awk默认的分隔符是空白,使用-F选项可以指定分隔符,比如使用“,”作为分隔符
awk -F , '{print}' awk.txt
对于awk的分割方法,例如有文本awk.txt
john.wang male 30 021-111111
lucy.yang female 25 021-222222
jack.chen male 35 021-333333
lily.gong demale 20 021-444444 shanghai
运行 awk '{print $1}' awk.txt
john.wang
lucy.yang
jack.chen
lily.gong
awk先读入第一行,使用空白分成了4个域,$0表示第一行整行,如下
john.wang male -
$ $ $ $
所以上面输出的是第一列。
print和printf
首先说明的是这两个不是c里面的函数,而是awk的内建命令
print:打印之后自动换行,打印的多个值之间不会有间隔
printf:更丰富的格式化输出,打印一行不能自动换行
内建变量
awk作为一门程序语言提供了一些内建变量,这里看看常见的
NF 当前记录的colum数
NR 当前记录的序号,如果按行分就是行号
RS 每条记录的分割符,默认是"\n"
NF:有时候我们不知道每条记录具体有多少列,但是我们想打印出最后一列,就可以使用 {print $NF}
NR:有时候我们只想处理文本中的某些行,可以使用NR来指定需要处理的行
综合应用
准备了这么多终于可以开始分析日志了,我的日志格式如下
5x.247.204. - [/Jul/::: +] "POST /user/login HTTP/1.1" "http://www.xxxx.com/home/views/index/index" "Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko"
1x.153.105. - [/Jul/::: +] "POST /user/send HTTP/1.1" "http://www.xxxx.com/home/views/index/index" "Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko"
1x.153.105. - [/Jul/::: +] "POST /user/regist HTTP/1.1" "http://www.xxxx.com/home/views/index/index" "Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko"
因为收到了大量的恶意访问,我就想统计一下对于接口/user/login究竟哪些ip访问最多,一开始使用sed和awk
sed -n '10000,${/user\/login/p}' access.log | awk '{print $1}' |sort| uniq -c | sort -n
- -n:选定行号
- '10000,${/user\/login/p}':从10000行开始,逗号","后面没有值,表示到最后一行,查找匹配的 "/user\/login" 的行,p表示打印出来
- awk '{print $1}':打印出第一列(也就是ip)
- sort:使用sort对输出的ip进行排序
- uniq -c:对排序后的ip进行去重合并统计(一般和sort合用,因为uniq只能对连续的相同的行进行合并)
- sort -n:对输出内容进行按数字排序
输出如下(对ip进行处理使用“x”打码):
1xx.41.12.17
1xx.190.94.49
2xx.4.47.166
2xx.203.63.178
1xx.62.101.177
2xx.133.116.25
这样就可以统计出非法访问的ip使用nginx的黑名单功能进行屏蔽。
其实上sed的作用就是限制指定行并搜索,其实awk本身就可以做了
awk 'NR>=760&&NR<=890 {print $1}' access.log | sort |uniq -c | sort -n
上面使用了内建变量NR,而且使用到了awk逻辑运算&&,关于awk具体语法等以后使用的频繁了再仔细学习,不然学了不用就忘记啦。
linux命令-awk入门的更多相关文章
- 【转】如何利用多核CPU来加速你的Linux命令 — awk, sed, bzip2, grep, wc等
如何利用多核CPU来加速你的Linux命令 — awk, sed, bzip2, grep, wc等 你是否曾经有过要计算一个非常大的数据(几百GB)的需求?或在里面搜索,或其它操作——一些无法并 ...
- <转>如何利用多核CPU来加速你的Linux命令 — awk, sed, bzip2, grep, wc等
原文链接:http://www.vaikan.com/use-multiple-cpu-cores-with-your-linux-commands/ 你是否曾经有过要计算一个非常大的数据(几百GB) ...
- 转摘--如何利用多核CPU来加速你的Linux命令 — awk, sed, bzip2, grep, wc等
http://www.vaikan.com/use-multiple-cpu-cores-with-your-linux-commands/ 你是否曾经有过要计算一个非常大的数据(几百GB)的需求?或 ...
- 如何利用多核CPU来加速你的Linux命令 — awk, sed, bzip2, grep, wc等(转)
你是否曾经有过要计算一个非常大的数据(几百GB)的需求?或在里面搜索,或其它操作——一些无法并行的操作.数据专家们,我是在对你们说.你可能有一个4核或更多核的CPU,但我们合适的工具,例如 grep, ...
- Linux命令awk
1.简介 awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大. 简单来说awk就是把文件逐行读入,默认以空格为分隔符将每行切片,切开的部 ...
- 【Linux】AWK入门
什么是AWK AWK是一种用于处理文本的编程语言工具,一个模式匹配程序.一个典型的示例是将数据转换成格式化的报告. 在命令行输入如下awk命令: awk -F":" '{ prin ...
- [ Linux 命令 ] awk
一.AWK简介 awk:报告生成器,是以行为单位进行处理,并格式化后显示 awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说a ...
- linux命令-awk,sort,uniq
学习地址:http://man.linuxde.net/awk#awk的工作原理 awk 选项参数说明: -F fs or --field-separator fs 指定输入文件折分隔符,fs是一个字 ...
- 每天一个linux命令--awk
统计计算日志 pmail@app2linux04 performance]$ grep 'user:logBehaviorAction' performance.log|awk -F '|' '{pr ...
随机推荐
- excel日期拾取插件(支持Excel 2007 - 2016)
插件安装完毕后示意图如下: 插件安装说明请查看附件里面的安装说明. 插件下载
- 2019.03.29 bzoj5463: [APIO2018] 铁人两项(圆方树+树形dp)
传送门 题意简述:给你一张无向图,问你满足存在从a−>b−>ca->b->ca−>b−>c且不经过重复节点的路径的有序点对(a,b,c)(a,b,c)(a,b,c) ...
- 转发:RSA实现JS前端加密,PHP后端解密
web前端,用户注册与登录,不能直接以明文形式提交用户密码,容易被截获,这时就引入RSA. 前端加密 需引入4个JS扩展文件,jsbn.js.prng4.js.rng.js和rsa.js. <h ...
- oracle odbc mysql 字段不全
主要是字段集不对,mysql的字符集默认设置为utf8,odbc才是unicode编码连接,无法转发.选择ansi连接方式即可.
- HDU 6377 度度熊看球赛 (计数DP)
度度熊看球赛 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Subm ...
- Python的list循环遍历中,删除数据的正确方法
在遍历list,删除符合条件的数据时,总是报异常,代码如下: num_list = [1, 2, 3, 4, 5] print(num_list) for i in range(len(num_lis ...
- Linux编程之fork函数
在Linux中,fork函数的功能就是在一个进程中创建一个新的进程,当前调用fork函数的进程就是产生的新进程的父进程,新进程在以下也称为子进程.在新进程生成之后就会在系统中开始执行. 函数原型:pi ...
- 安装Pangolin
Pangolin是一个用于OpenGL显示/交互以及视频输出的一个轻量级 快速开发库 一:安装必要的库 1.Glew sudo apt-get install libglew-dev 2.Cmake ...
- stm32模拟IO读写AT24C02
/* *@brief 主机向从机写多字节 * *@param addr - 地址 *@param p_buf - 数据指针 *@param len - 待写入字节长度 * *@return * *@n ...
- grep 笔记
-a :将 binary 文件以 text 文件的方式搜寻数据-c :计算找到 '搜寻字符串' 的次数-i :忽略大小写的不同,所以大小写视为相同-n :顺便输出行号-v :反向选择,亦即显示出没有 ...