awk使用实例

  简介

awk是一种编程语言,非常适合处理文本,使用简单,功能却很强大。awk扫描文件中的每一行,查找与命令行中所给定内容相匹配的模式。如果发现匹配内容,则进行下一个编程步骤。如果找不到匹配内容,则继续处理下一行

示例

基本使用

输出文件的第一列

awk '{print $1}' access_log

使用自定义的分隔符(默认是空格)

awk -F ', ' '{print $1}' access_log
awk -F '&q=' '{print $2}' access_log

条件判断

awk '$9==304 {print}' access_log
awk '$6 > 0 {print $10}' access_log  

正则匹配

awk '$7~/^//ppp/ {print $7}' access_log
awk '$7!~/^//manage/ {print $7}' access_log

显示多个字段

awk '{print $1, $6}' access_log

改变输出格式

awk '{print "req:/t" $7 "/t" $9}' access_log

使用printf格式化输出

awk '{printf("req:/t%s/t%.2f/n", $6, $9)}' access_log

使用外部文件

当脚本比较复杂时,可以将脚本放到外部文件,通过-f选项指定

awk -f slowreq.awk access.log

外部文件内容:

$6 > 0 {
        split($10,a,"?");
        req=a[1];
        print req;
        
}

BEGIN和END块

awk 在开始处理输入文件之前会执行 BEGIN 块,因此它是初始化 FS(字段分隔符)变量、打印页眉或初始化其它在程序中以后会引用的全局变量的极佳位置。同时awk在处理了输入文件中的所有行之后会执行END块。通常,END 块用于执行最终计算或打印应该出现在输出流结尾的摘要信息

对某一列求和

awk 'BEGIN{sum=0} {sum=$9+sum} END {print "sum " sum}' data

内部变量

常用的包括

  • FS 输入的分隔符,也就是-F指定的
    awk 'BEGIN {FS="-"}{print $3}' access_log
  • OFS 输出的分隔符
    awk 'BEGIN {OFS="-"}{print $1, $6}' access_log
  • FNR 输入文件的记录数
    // 求平均数
    awk 'BEGIN{sum=0} {sum=$9+sum} END {print "average " sum / FNR}' access_log
  • NF 当前行的字段数
    // 从第6个字段开始输出
    awk '{for(i=6; i<NF; ++i){printf "%s,",$i};printf "%s/n", $NF}' access_log
  • NR 当前处理的行数
    // 从第6行开始输出,到100行为止,并打印出行数
    awk '{if(NR >= 6 && NR <=100) printf "%d: %s/n", NR, $7}' access_log

组合使用

awk通常都与sort等命令组合使用

// 输出第七个字段的前10名
awk '{print $7}' access_log|sort |uniq -c |sort -n -r |head -10

参考资料

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值