Linux命令三剑客之awk的使用(一)

awk简介

awk是一种使用方便且表现力很强的编程语言,它的名字来源于他的三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的姓,有趣的是Alfred和Brian刚好是蝙蝠侠和他的管家的名字。
它可以应用在多种不同的计算与数据处理任务中。由于awk天生提供对文件中文本分列进行处理,所以如果一个文件中的每行都被特定的分隔符(常见的是空格)隔开,我们可以将这个文件看成是由很多列的文本组成,这样的文件最适合用awk进行处理,其实awk在工作中很多时候被用来处理log文件,进行一些统计工作等。

命令结构

awk [options] ‘pattern{action}’ file

options是可选项,pattern是模式,action是动作,这是awk命令的基本构成,后面会说。

  1. awk的执行过程是扫描文件的每一行,如果有和模式匹配的,就执行后面的一系列动作。
  2. 动作的花括号‘{}’并不是一定要写的,用于和pattern进行分组
  3. 默认情况下,回车换行默认是一行的结束,$表示第几列,举个例子:
    awk '{print $3}' 就是输出第三列,$0表示整行输出

常见options选项

  • -F:指定字段分隔符,默认是空格
  • -v: 初始化绑定变量
  • -f :从文件读取awk命令,这种适合命令较长的情况

pattern模式

常用的是正则表达式,用斜杠隔开,后面有实例,这里介绍两种特殊的pattern。

  • BEGIN : 处理开始前执行的操作,可以用来初始化变量等
  • END: 处理完成后执行的操作
    这两个语句只会执行一次

action动作

awk ‘{print 12}’ 表示连接在一起输出。
awk ‘{print 1,2}’ 表示用分隔符隔开输出。

内置变量

变量名作用
$n当前记录的第n个字段,比如n为1表示第一个字段,n为2表示第二个字段
$0这个包含执行过程中当前行的文本内容。
FILENAME当前输入文件的名称
NR表示记录数,在执行过程中对应于当前的行号
FNR同NR:,但相对于当前文件
FS字段分隔符(默认是任何空格)
NF示字段数,在执行过程中对应于当前的字段数。print $NF-行中最后一个字段
OFS输出字段分隔符(默认值是一个空格)
ORS输出记录分隔符(默认值是一个换行符)
RS记录分隔符(默认是一个换行符)

操作实例

  1. 新建文件demo.txt,可以看到里面有四行数据,每一行有三列
    demo.txt
  2. 开始操作
  • 输出第二列

awk ‘{print $2}’ demo.txt

在这里插入图片描述

  • 输出第一列和第三列

awk ‘{print $1,$3}’ demo.txt

在这里插入图片描述

  • 输出第二列中包含字符“zhang”的行

awk ‘$2~/^zhang/{print;}’ demo.text

在这里插入图片描述

  • 输出第二列不包含“yong”的行

awk ‘$2!~/^yong/{print;}’ demo.text
在这里插入图片描述

  • 输出第二列不包含字符“yong”并且第三列大于70的列

awk ‘$2!~/^yong/ && $3>70{print;}’ demo.text

在这里插入图片描述

  • 输出第二列不包含字符“yong”并且第三列大于70的列,并且处理开始前和处理完成后输出信息

awk ‘BEGIN{print “start”}$2!~/^yong/ && $3>70{print;}END{print “end”}’ demo.text

在这里插入图片描述

  • 输出第一行

awk ‘NR == 1{print;}’ demo.text

在这里插入图片描述

  • 输出最后一行

awk ‘END{print;}’ demo.text

在这里插入图片描述

  • 计算第三列的和

awk ‘BEGIN{sum}{sum+=$3}END{print sum}’ demo.text

在这里插入图片描述

  • 计算第三列的和并打印文件名

awk ‘BEGIN{sum}{sum+=$3}END{print sum,FILENAME}’ demo.text

在这里插入图片描述

  • 打印第一行的字段个数

awk ‘NR == 1{print “第一行有”+NF+“个字段”}’ demo.text

在这里插入图片描述

  • 打印每一行最后一个字段

awk ‘{print $NF}’ demo.text

在这里插入图片描述

  1. 新建文件demo1.txt,以“:”作为分隔符

在这里插入图片描述

  • 指定分隔符为 :,并且分别打印第一列,第二列和第三列

第一种 ,-F选项指定

awk -F “:” ‘{print $1,$2,$3}’ demo1.txt

在这里插入图片描述
第二种,BEGIN语句内赋值FS内置变量,FS理解为filed spilt即可

awk ‘BEGIN{FS=":"}{print $1,$2,$3}’ demo1.txt

在这里插入图片描述
第三种,-v选项初始化内置变量FS

awk -v FS=":" ‘{print $1,$2,$3}’ demo1.txt

在这里插入图片描述

  1. 新建文件demo2.txt,我们看到只有一行
    在这里插入图片描述
  • 指定行记录换行符为#,并打印,需要注意的是#左右两边的空格不会去掉

awk ‘BEGIN{RS="#"}{print;}’ demo2.txt

在这里插入图片描述

  • 指定行记录换行符为#,字段分隔符为:,并打印

awk ‘BEGIN{RS="#";FS=":"}{print $1,$2,$3}’ demo2.txt

在这里插入图片描述

  • 指定行记录换行符为#,字段分隔符为:,输出时指定字段之间分隔符为+++(默认是空格),并打印

awk ‘BEGIN{RS="#";FS=":";OFS="+++"}{print $1,$2,$3}’ demo2.txt

在这里插入图片描述

  • 指定行记录换行符为#,字段分隔符为:,输出时指定字段之间分隔符为+++(默认是空格),行记录分隔符为 ***(默认是换行符)

awk ‘BEGIN{RS="#";FS=":";OFS="+++";ORS="***"}{print $1,$2,$3}’ demo2.txt

在这里插入图片描述

  • 通过文件导入awk命令,并且输出表格(增加表头)

awk -f awk_file demo.text

文件内容
在这里插入图片描述

输出效果:
在这里插入图片描述

写在最后

以上列举了一些常见的用法,awk我们一般是配合其他命令进行处理。除此之外,awk还有很多高级特性,有待各位读者研究。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值