awk介绍及应用

一、awk简介

awk是一门编程语言、主要用于文本分析和数据处理、它可以是单行命令或一段脚本程序、它是解析执行并逐行扫描文件。

二、简单例子

1、打印含有Mary的行   

awk '/Mary/' employee

2、打印第一列,可以指定列之间的分隔符,默认为空格。 

awk '{print $1}' employee 
awk -F "\t" '{print $1}'  employee

3、打印含有Sally行的第一列第二列

awk '/Sally/ {print $1,$2}' employee

4、报告剩余空间小于100M的盘 

df | awk '$4 < 100000'

5、awkfile

  awkfile
  /Mary/{print "Hello Mary!"}
  {print $1,$2,$3}
  
  awk -f awkfile employee

 逐行读取数据文件到缓存里并执行awkfile文件每个命令。

三、记录和域

记录:默认情况下,awk把每行叫做一条记录,并以换行符结束
记录分隔符:保存在内置awk变量ORS和RS。

awk '{print “11111",ORS}'

变量$0保存当前记录 

awk '{print $0}’ employee

NR代表行号 

awk '{print NR,$0}' employee

域:就是字段,默认分隔符是空白区域,也就是空格或制表符

awk '{print NF}' employee

FS: 保存域分隔符,可以在命令行或BEGIN语句中改变,缩写-F

awk '{print $1,$2}' employee2
awk -F: '{print $1,$2}' employee2 

四、模式和操作

awk程序结构:

pattern { action }

只有模式没有操作:将每一个匹配行打印出来

awk '/Tom/' employee

只有操作没有模式:每一个输入行都会被执行 

awk '{print $3 + $5}' employee

模式:包含一个正则表达式或条件表达式或它们组合。

 awk ' $3 > 2000' employee 
 awk '{if ($3 > 2000) print $0} ' employee

操作:封装在花括号里由分号分隔的语句

awk '/Tom/ {print "Hello there,",$1}' employee

五、awk编程结构

关系操作符 >、<、>=、<=、!=、~、!~
条件表达式

awk '{ max = ($3>$5)?$3:$5; print max}' employee
awk '($3 > 2000) {print $4 + $5 }' employee | awk '{sum +=$1} END{print sum/NR}’

计算:可以在模式里执行计算,awk以浮点方式执行

awk '$5/$3 > 10' employee

六、变量

常数:数值常数、字符串常数(用双引号括起来)
用户自定义变量:不用声明,类型会自动转换

awk '$1 ~/Tom/ {wage = $2 * $3;print wage}' employee
awk '$1 ~/Tom/ {wage = $5 * $3;print wage}' employee

内置变量:

NR:当前记录数 

awk '{print NR,$0}' employee

FNR:当前文件当前记录数

awk '{print FNR,$0}' employee

NR与FNR区别:

awk '{print FNR,$0}' employee employee2
awk '{print NR,$0}' employee employee2

NF: 当前域的个数 

awk '{print NF,$0}' employee
awk '$1!="Mary" {print NR,$1,$2,$NF}' employee
awk '$1=="Mary" {print NR,$1,$2,$NF}' employee

七、BEGIN&&END

BEGIN模式:后面跟一个操作模块,在awk处理文件之前执行该模块,主要用来设置FS(输入域分隔符)、RS(输入记录分隔符)、OFS(输出域分隔符)、ORS(输出记录分隔符)。

awk 'BEGIN{OFS="\t";ORS="\n\n"} {print}' employee

END模式:在所有行处理完毕之后再处理END模式

awk '/Mary/ {count++} END{print "Mary was found " count}' employee

八、重定向和管道

把输出重定向到Linux文件

awk '$3 > 2000 {print $1,$2 > "text_file"}' employee
awk '$3 > 2000 {print $1,$2}' employee > text_file2
awk 'BEGIN {"date"|getline d;print d}’

管道

awk '{print $1,$2 | "sort"}' employee

九、条件/循环/数组

条件:

awk '{if ($3 >100) {safe++;print $1 " OK" safe}}' employee

循环: 

awk '{i = 1;while (i<=NF) {print $i;i++}}' employee
awk '{for(i=1;i<=NF;i++) print $i}' employee

数组:

awk '{name[x++] = $2}; END{for(i=0;i<NR;i++) print i,name[i]}' employee

十、案例

1、显示最近登录的10个账号

last -n 5 | awk '{print $1}’

2、显示/etc/passwd账号

cat /etc/passwd | awk -F ':' '{print $1}’

3、定位多少ip在爆破root账号

grep "Failed password for root" /var/log/secure | awk '{print $11}'|sort | uniq -c | sort -nr | more

4、登录成功的IP有哪些

grep 'Accepted' /var/log/secure | awk '{print $1,$2,$3,$9,$11}’

十一、使用awk分析accesslog

cat access.log | awk '$9 != 200 {print $1,$7}’

统计浏览器类型:

cat access.log | awk '{print $12,$13,$14,$1
5,$16,$17,$18,$19,$20,$21,$22,$23,$23}’
awk -F \" '{print $6}' access.log | sort | uniq -c | sort

发现系统中存在的问题

awk '{print $9}' access.log | sort | uniq -c | sort

查找出所有404的请求

awk '($9 ~ /404/)' access.log
awk '($9 ~ /404/)' access.log | awk '{print $9,$7}' | sort

统计共有多少不同IP访问:

awk '{print $1}' access.log | sort | uniq | wc -l

统计每一个IP访问了多少页面:

awk '{++S[$1]} END {for (a in S) print S[a],a}' access.log | sort -nr

查看某一IP访问了多少页面:

grep ^149.135.10.56 access.log | awk '{print $1,$4,$7}’

统计访问最多的前10个IP

awk '{print $1}' access.log | sort | uniq -c | sort -nr | head -10

列出传输大小最大的几个文件

cat access.log | awk '{print $10,$1 "" $4 $7}' | sort -nr | head -100

响应时间超过3秒的请求:

awk '($NF > 3){print $0}' access.log

生成SQL

{printf "insert into product_sku(product_name,barcode,prod_code,purchase_price,base_price,catalogue_price) values(%s,%s,%s,%s,%s,%s\n",$3,$1,$2,$4,$5,$6}
#'{printf “);\n"}'
awk -F"," -f insertSql newproduct.csv

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值