最近经常查看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入门的更多相关文章

  1. 【转】如何利用多核CPU来加速你的Linux命令 — awk, sed, bzip2, grep, wc等

    如何利用多核CPU来加速你的Linux命令 — awk, sed, bzip2, grep, wc等   你是否曾经有过要计算一个非常大的数据(几百GB)的需求?或在里面搜索,或其它操作——一些无法并 ...

  2. <转>如何利用多核CPU来加速你的Linux命令 — awk, sed, bzip2, grep, wc等

    原文链接:http://www.vaikan.com/use-multiple-cpu-cores-with-your-linux-commands/ 你是否曾经有过要计算一个非常大的数据(几百GB) ...

  3. 转摘--如何利用多核CPU来加速你的Linux命令 — awk, sed, bzip2, grep, wc等

    http://www.vaikan.com/use-multiple-cpu-cores-with-your-linux-commands/ 你是否曾经有过要计算一个非常大的数据(几百GB)的需求?或 ...

  4. 如何利用多核CPU来加速你的Linux命令 — awk, sed, bzip2, grep, wc等(转)

    你是否曾经有过要计算一个非常大的数据(几百GB)的需求?或在里面搜索,或其它操作——一些无法并行的操作.数据专家们,我是在对你们说.你可能有一个4核或更多核的CPU,但我们合适的工具,例如 grep, ...

  5. Linux命令awk

    1.简介 awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大. 简单来说awk就是把文件逐行读入,默认以空格为分隔符将每行切片,切开的部 ...

  6. 【Linux】AWK入门

    什么是AWK AWK是一种用于处理文本的编程语言工具,一个模式匹配程序.一个典型的示例是将数据转换成格式化的报告. 在命令行输入如下awk命令: awk -F":" '{ prin ...

  7. [ Linux 命令 ] awk

    一.AWK简介 awk:报告生成器,是以行为单位进行处理,并格式化后显示 awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说a ...

  8. linux命令-awk,sort,uniq

    学习地址:http://man.linuxde.net/awk#awk的工作原理 awk 选项参数说明: -F fs or --field-separator fs 指定输入文件折分隔符,fs是一个字 ...

  9. 每天一个linux命令--awk

    统计计算日志 pmail@app2linux04 performance]$ grep 'user:logBehaviorAction' performance.log|awk -F '|' '{pr ...

随机推荐

  1. Python Day 6

    阅读目录:   内容回顾:   深浅拷贝:   元组:   字典   集合 ##内容回顾 #1.数字类型 int | float | bool | complex #2.字符串 #常规操作: -- 索 ...

  2. python中使用XPath

    XPath在Python的爬虫学习中,起着举足轻重的地位,对比正则表达式 re两者可以完成同样的工作,实现的功能也差不多,但XPath明显比re具有优势,在网页分析上使re退居二线. XPath介绍: ...

  3. apt-get update 出现错误“ AppStream cache update completed, but some metadata was ignored due to errors. ”

    只需要 执行 sudo rm /var/lib/dpkg/lock;     之后再次执行:sudo apt-get update

  4. centos6安装oracle11g过程中报错Error in invoking target “install” of makefile ‘/home/oracle/app/oracle/product/11.2.0/dbhome_1/ctx/lib/ins_ctx.mk’

    报这个错误的原因是由于缺少compat_libstdc包所导致.安装即可 1.在http://www.rpm-find.net/linux/rpm2html/search.php?query=comp ...

  5. Maven学习3(中央仓库)

    Maven项目在运行的时候,会首先找本地仓库是否有需要的jar,如果没有则去调用远程仓库. 解读Maven在仓库中的存储路径: 1.基于groupId准备路径,将句点分隔符转成路径分隔符,就是将  & ...

  6. Leetcode(三)无重复字符的最长子串

    3. 无重复字符的最长子串 题目描述 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最 ...

  7. input type='file'文件上传自定义样式

    使用场景: 在未使用UI库时免不了会用到各种上传文件,那么默认的上传文件样式无法达到项目的要求,因此重写(修改)上传文件样式是必然的,下面的效果是最近项目中自己写的一个效果,写出来做个记录方便以后使用 ...

  8. 闵可夫斯基和(Mincowsky sum)

    一.概述 官方定义:两个图形A,B的闵可夫斯基和C={a+b|a∈A,b∈B}通俗一点:从原点向图形A内部的每一个点做向量,将图形B沿每个向量移动,所有的最终位置的并便是闵可夫斯基和(具有交换律) 例 ...

  9. Hive数据倾斜解决方案

    https://blog.csdn.net/yu0_zhang0/article/details/81776459 https://blog.csdn.net/lxpbs8851/article/de ...

  10. vs链接错误解决方法

    常见引起链接错误的主要原因是由于项目不能找到所需的动态库的路径: 这里介绍一下引用第三方动态库的配置方法: 方法一: vs加载动态库需要先把动态库拷贝到exe所在文件夹,再修改项目属性: 链接器-&g ...