awk入门应用

awk概述
使用语法
常用命令选项
相关输出命令
print item1,item2,…
printf FORMAT,item1,item2,….
相关格式符
相关修饰符
相关内建变量
相关内置函数
相关操作符
相关模式
相关控制语句及示例
if(condition) statements
if(condition){statements} else {statements}
while (condition){statements}
for(expr1;expr2;expr3){statements}
相关扩展 针对与使用awk统计网站访问相关
统计访问频次最高的5个ip
统计恶意ip
找出访问最多的文件(下载类网站常用,这里以.exe扩展名举例)
统计该网站的流量,统计结果以“G“”显示
查看日志中出现100次以上的IP
查看某一IP在网站内都访问了哪些资源

awk概述

awk是一种编程语言,用于在linux/unix下对文本和数据进行处理。数据可以来自标准输入、一个或多个文件,或其它命令的输出。它支持用户自定义函数和动态正则表达式等先进功能,是linux/unix下的一个强大编程工具。它在命令行中使用,但更多是作为脚本来使用。awk的处理文本和数据的方式是这样的,它逐行扫描文件,从第一行到最后一行,寻找匹配的特定模式的行,并在这些行上进行你想要的操作。如果没有指定处理动作,则把匹配的行显示到标准输出(屏幕),如果没有指定模式,则所有被操作所指定的行都被处理。awk分别代表其作者姓氏的第一个字母。因为它的作者是三个人,分别是Alfred Aho、Brian Kernighan、Peter Weinberger。gawk是awk的GNU版本,它提供了Bell实验室和GNU的一些扩展。下面介绍的awk是以GUN的gawk为例的,在linux系统中已把awk链接到gawk,所以下面全部以awk进行介绍。

使用语法

awk [ -F Ere ] [ -v Assignment ] … { -f ProgramFile | 'Program' } [ [ File … | Assignment … ] ] …

常用命令选项

-F fs or --field-separator fs 
指定输入文件折分隔符,fs是一个字符串或者是一个正则表达式,如-F:。 
-v var=value or --asign var=value 
赋值一个用户定义变量。 
-f scripfile or --file scriptfile 
从脚本文件中读取awk命令。

相关输出命令

print item1,item2,…

要点:

逗号作为item的分隔符 
输出的item可是字符串,也可以是数值:当前记录的字段、变量或awk的表达式 
如省略item,相当于print $0

printf FORMAT,item1,item2,….

要点:

FORMAT是必须要给出的 
不会自动换行,需要显示给出换行控制符 \n 
FORMAT中需要分别为后面的每个item指定一个格式化符号

相关格式符

格式符 描述
%c 显示字符的ASCII码
%d,%i 显示十进制整数
%e,%E 科学计数法数值显示
%f 显示为浮点数
%g,%G 以科学计数法或浮点形式显示数值
%s 显示字符串
%u 无符号整数
%% 显示%自身

相关修饰符

修饰符 描述
m[.n] m表示控制显示的宽度,默认右对齐;n表示小数点后的精度
左对齐
+ 显示数值的符号

相关内建变量

变量名 描述
FS input field seperator ,指定输入分隔符,默认为空白字符
OFS output field seperator,指定输出分隔符,默认为空白字符
RS input record seperator,指定输入行分隔符
ORS output record seperator,指定输出行分隔符
NF number of field,字段数量
{print NF} 打印统计的字段数量
{print $NF} 打印每行的最后一字段
NR number of record,行数
FNR 多文件统计,各文件分别计数,显示行数
FILENAME 当前文件名
ARGC 命令行参数的个数
ARGV 命令行中给定的各参数

相关内置函数

函数表达式 描述
rand() 返回0-1之间的随机数,小数
length([$]) 返回指定字符串的长度
sub(r,s,[t]) 以r表示的模式来查找t所表示的字符串中的匹配的内容,并将其第一次出现替换为s所表示的内容
gsub(r,s,[t]) 以r表示的模式来查找t所表示的字符串中的匹配的内容,并将其所有出现全部替换为s所表示的内容
split(s,a[,r]) 以r为分隔符切割字符s,并将切割后的结果保存在a所表示的数组中

相关操作符

运算符 描述
= += -= *= /= %= ^= **= 赋值
?: C条件表达式
|| 逻辑或
&& 逻辑与
~ 匹配正则表达式
~! 不匹配正则表达式
< <= > >= != == 关系运算符
空格 连接
+ – 加,减
* / & 乘,除与求余
+ – ! 一元加,减和逻辑非
^ *** 求幂
++ – 增加或减少,作为前缀或后缀
$ 字段引用
in 数组成员

相关模式

模式 描述
empty 空模式,匹配每一行
BEGIN{} 仅在开始处理文件中的文本之前执行一次
END{} 仅在文本处理完成之后执行一次
/regular expression/ 仅处理能够被此处模式匹配到的行
relational expression 关系表达式,结果有"真"有"假",结果为"真"才会被处理,真:结果为非0值,非空字符串
line ranges 行范围,startline,endline:/pat1/,/pat2/或(NR>=startline&&NR<=endline)

相关控制语句及示例

if(condition) statements

找出系统上UID大于等于1000的用户,并将用户输出形式类似于“Conmon user: gwx”

awk -F: '{if ($3>=1000) printf "Common user: %s\n",$1}' /etc/passwd

找出系统上默认shell为/bin/bash的用户,并输出该用户的用户名

awk -F: '{if ($NF == "/bin/bash")print $1}' /etc/passwd

找出系统上默认shell为bash的用户,并输出该用户的用户名

awk -F: '{if ($NF~"bash$")print $1}' /etc/passwd

输出当前系统上fstab挂载的设备情况

awk  '{if ($1!="#")print $0}' /etc/fstab

输出当前系统使用比例超过80%的分区

df -h |awk -F% '/\/dev/{print $1}'|awk '{if ($NF>80)print $1}'

if(condition){statements} else {statements}

找出系统上UID大于等于1000的用户,并将用户输出形式类似于“Conmon user: gwx”,其余用户输出形式类似于“Sysuser:php”

awk -F: '{if ($3>=1000) {printf "Common user: %s\n",$1} else {printf "Sysuser: %s\n",$1}}' /etc/passwd

while (condition){statements}

输出当前系统/etc/grub2.cfg文件中以linux16开头的行的字符数大于等于7个的字段,并在字段的后面显示该字段的字符数

awk '/^[[:space:]]*linux16/{i=1;while (i<=NF){if (length($i)>=7){print $i,length($i)};i++}}' /etc/grub2.cfg

for(expr1;expr2;expr3){statements}

输出当前系统/etc/grub2.cfg文件中以linux16开头的行字段,并在字段的后面显示该字段的字符数

awk '/^[[:space:]]*linux16/{for (i=1;i<=NF;i++){print $i,length($i)}}' /etc/grub2.cfg

相关扩展 针对与使用awk统计网站访问相关

日志字段定义样例如下,如果日志文件做了轮替设置,请查看对应要统计的日志文件做统计分析 
10.6.9.15 – – [12/Nov/2016:16:24:15 +0800] "GET / HTTP/1.1" 200 258 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.87 Safari/537.36"

统计访问频次最高的5个ip

cat /var/log/httpd/access_log |awk '{print $1}'|sort|uniq -c|sort -nr|head -5

统计恶意ip

cat /var/log/httpd/access_log|awk '{if($9~/40/){print $1}}'|sort|uniq|sort -nr

找出访问最多的文件(下载类网站常用,这里以.exe扩展名举例)

cat /var/log/httpd/access_log|awk '($7 ~/.exe/){print $10 "" $1 "" $4""$7}' |sort -n |uniq -c |sort -nr |head -10

统计该网站的流量,统计结果以“G“”显示

cat /var/log/httpd/access_log|awk '{sum+=$10} END {print sum/1024/1024/1024"G"}'

查看日志中出现100次以上的IP

cat /var/log/httpd/access_log-20161113|cut -d ' ' -f 1 |sort |uniq -c | awk '{if ($1 > 100) print $0}'

查看某一IP在网站内都访问了哪些资源

 cat /var/log/httpd/access_log-20161113| grep 10.6.9.15| awk '{print $1"\t"$7}' | sort | uniq -c | sort -nr | less

原创文章,作者:N24-wenxuan,如若转载,请注明出处:http://www.178linux.com/62423

(0)
N24-wenxuanN24-wenxuan
上一篇 2016-12-04 11:58
下一篇 2016-12-04 13:48

相关推荐

  • mysqldump的备份与恢复

    MySQL(05) 备份策略:     完全+差异+binlog(时间点还原)     完全+增量+binlog     备份,多久一次?         数据…

    Linux干货 2016-11-20
  • corosync+pacemaker+drbd+mysql来实现mysql的高可用和数据的同步

    实现拓扑图: 实验流程: 先对两主机安装上corosync和pacemaker 两主机安装drbd服务,并且设置好drbd的组设备 选择drbd主节点上,进行数据库的初始化 进行资源的定义和配置 测试 实验前,我们还需要做一些准备工作: 1、时间必须保持同步   使用ntp服务器 2、节点必须名称互相通信    解析节点名称 &…

    Linux干货 2015-11-10
  • 编程语言编年史

          我们都知道,编程语言是一组用来定义计算机程序的语法规则。它是一种被标准化的交流语言,用来向计算机发出指令。一种计算机语言让程序员能够准确地定义计算机所需要使用的数据,并精确地定义在不同情况下所应当采取的行动。尽管人们多次试图创造一种通用的程序设计语言,却没有一次尝试是成功的。之所以有那么多种不同的编程语言存在的原因是…

    Linux干货 2017-03-30
  • Openssl搭建私有CA认证

    概述 CA英文全称Certification Authority,即数字证书认机构。从广义上来说,CA是负责发放和管理数字证书的权威机构,并作为用户数字认证中受信任的第三方,承担公钥体系(PKI)中公钥的合法性检验的责任,在互联网上,实现用户与用户、用户与企业之间的数字身份认证。 本文通过使用openssl进行搭建私有CA认证体系,从而简单地了解CA的认证过…

    Linux干货 2016-09-22
  • CentOS Linux解决Device eth0 does not seem to be present

    CentOS Linux解决Device eth0 does not seem to be present 今天早上打开xshell链接虚拟机,突然链接不上。然后进入虚拟机执行 ifconfig 或者 ip addr list 命令发现eth0 不见。然后执行重启网卡命令发现  解决办法:   首先,打开/etc/udev/rules.d/70-p…

    Linux干货 2016-08-02
  • 程序包管理及定时任务

    程序包管理及定时任务

    Linux干货 2018-01-01