linux命令-awk入门
2016-07-23 13:08
489 查看
最近经常查看nginx日志,有时候需要做一些统计分析,于是就想起了awk,学习了就顺便做一个记录。
基本用法:常用到的awk语法
内建变量
综合实例
由于暂时的应用比较简单就直接使用命令行。
'program text':表示awk语句,格式为"Pattern { ACTIONS; }",其中patern就是正则表达式,action就是对于前面匹配文本的操作,比如print
-F:上面说了awk默认的分隔符是空白,使用-F选项可以指定分隔符,比如使用“,”作为分隔符
对于awk的分割方法,例如有文本awk.txt
运行 awk '{print $1}' awk.txt
awk先读入第一行,使用空白分成了4个域,$0表示第一行整行,如下
所以上面输出的是第一列。
print:打印之后自动换行,打印的多个值之间不会有间隔
printf:更丰富的格式化输出,打印一行不能自动换行
NF:有时候我们不知道每条记录具体有多少列,但是我们想打印出最后一列,就可以使用 {print $NF}
NR:有时候我们只想处理文本中的某些行,可以使用NR来指定需要处理的行
因为收到了大量的恶意访问,我就想统计一下对于接口/user/login究竟哪些ip访问最多,一开始使用sed和awk
-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”打码):
这样就可以统计出非法访问的ip使用nginx的黑名单功能进行屏蔽。
其实上sed的作用就是限制指定行并搜索,其实awk本身就可以做了
上面使用了内建变量NR,而且使用到了awk逻辑运算&&,关于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 30 021-111111 $1 $2 $3 $4
所以上面输出的是第一列。
print和printf
首先说明的是这两个不是c里面的函数,而是awk的内建命令print:打印之后自动换行,打印的多个值之间不会有间隔
printf:更丰富的格式化输出,打印一行不能自动换行
内建变量
awk作为一门程序语言提供了一些内建变量,这里看看常见的NF 当前记录的colum数 NR 当前记录的序号,如果按行分就是行号 RS 每条记录的分割符,默认是"\n"
NF:有时候我们不知道每条记录具体有多少列,但是我们想打印出最后一列,就可以使用 {print $NF}
NR:有时候我们只想处理文本中的某些行,可以使用NR来指定需要处理的行
综合应用
准备了这么多终于可以开始分析日志了,我的日志格式如下5x.247.204.60 - [22/Jul/2016:07:48:55 +0800] "POST /user/login HTTP/1.1" 404 178 "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.159 - [22/Jul/2016:07:48:55 +0800] "POST /user/send HTTP/1.1" 404 178 "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.161 - [22/Jul/2016:07:48:55 +0800] "POST /user/regist HTTP/1.1" 503 222 "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”打码):
51 1xx.41.12.17 52 1xx.190.94.49 54 2xx.4.47.166 56 2xx.203.63.178 58 1xx.62.101.177 60 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具体语法等以后使用的频繁了再仔细学习,不然学了不用就忘记啦。
相关文章推荐
- centos7.2安装配置
- CentOS系统操作mysql的常用命令
- 微软要干掉点对点 Skype,Linux 和 Mac 原生客户端将消亡
- 【linux工具使用】无法使用ssh 登录ubuntu16.04的问题解决方案(root账户)
- linux的vm相关参数介绍
- linux ls正则表达式
- CentOS下开启mysql远程连接,远程管理数据库
- Ubuntu 16.04安装搜狗输入法
- RedHat Linux 挂载U盘
- Linux关机命令
- Linux的watch命令 — 实时监测命令的运行结果
- CentOS6.8配置GO语言开发环境
- linux上课
- linux学习-linux操作系统介绍
- linux学习-硬件和软件的介绍
- linux utf-8 windows gbk eclipse乱码
- linux device driver --- 驱动 poll 执行流程图
- 宿主机ping不通虚拟机VMWARE中的linux系统
- 小代码 linux 消息队列
- linux数据备份