Linux三剑客传 | 老大:AWK

来源:编程三分钟

ID:coding3min

作者:小熊爱编程

概述

awk同sed命令类似,只不过sed擅长取行,awk命令擅长取列。(根据了解awk是一种语言,不过我们只关注他处理文本的功能,用的好的话几乎可以取代excel)

原理:一般是遍历一个文件中的每一行,然后分别对文件的每一行进行处理

用法:

awk [可选的命令行选项] 'BEGIN{命令 } pattern{ 命令 } END{ 命令 }' 文件名

打印某几列

$ echo 'I love you' | awk '{print $3 $2 $1}'
youloveI

我们将字符串 I love you 通过管道传递给awk命令,相当于awk处理一个文件,该文件的内容就是I love you,默认通过空格作为分隔符(不管列之间有多少个空格都将当作一个空格处理)I love you就分割成三列了。

假如分割符号为.,可以这样用

$ echo '192.168.1.1' | awk -F "." '{print $2}'
168

条件过滤

我们知道awk的用法是这样的,那么pattern部分怎么用呢?

awk [可选的命令行选项] 'BEGIN{命令 } pattern{ 命令 } END{ 命令 }' 文件名
$ cat score.txt
tom 60 60 60
kitty 90 95 87
jack 72 84 99
$ awk '$2>=90{print $0}' score.txt
kitty 90 95 87

$2>=90 表示如果当前行的第2列的值大于90则处理当前行,否则不处理。说白了pattern部分是用来从文件中筛选出需要处理的行进行处理的,这部分是空的代表全部处理。pattern部分可以是任何条件表达式的判断结果,例如>,<,==,>=,<=,!=同时还可以使用+,-,*,/运算与条件表达式相结合的复合表达式,逻辑 &&,||,!同样也可以使用进来。另外pattern部分还可以使用 /正则/ 选择需要处理的行。

判断语句

判断语句是写在pattern{ 命令 }命令中的,他具备条件过滤一样的作用,同时他也可以让输出更丰富

$ awk '{if($2>=90 )print $0}' score.txt
kitty 90 95 87
$ awk '{if($2>=90 )print $1,"优秀"; else print $1,"良好"}' score.txt
tom 良好
kitty 优秀
jack 良好

BEGIN 定义表头

awk [可选的命令行选项] 'BEGIN{命令 } pattern{ 命令 } END{ 命令 }' 文件名

使用方法如下:

$ awk 'BEGIN{print "姓名 语文 数学 英语"}{printf "%-8s%-5d%-5d%-5d\n",$1,$2,$3,$4}' score.txt
姓名 语文数学英语
tom 60 60 60
kitty 90 95 87
jack 72 84 99

这里要注意,我为了输出格式好看,做了左对齐的操作(%-8s左对齐,宽8位),printf用法和c++类似。

不仅可以用来定义表头,还可以做一些变量初始化的工作,例如

$ awk 'BEGIN{OFMT="%.2f";print 1.2567,12E-2}'
1.26 0.12

这里OFMT是个内置变量,初始化数字输出格式,保留小数点后两位。

END 添加结尾符

和BEGIN用法类似

$ echo ok | awk '{print $1}END{print "end"}'
ok
end

数据计算

这个地方我要放大招了!上面的知识点你都记住了吗?

$ awk 'BEGIN{print "姓名 语文 数学 英语 总成绩"; \
sum1=0;sum2=0;sum3=0;sumall=0} \
{printf "%5s%5d%5d%5d%5d\n",$1,$2,$3,$4,$2+$3+$4;\
sum1+=$2;sum2+=$3;sum3+=$4;sumall+=$2+$3+$4}\
END{printf "%5s%5d%5d%5d%5d\n","总成绩",sum1,sum2,sum3,sumall}'\
 score.txt
姓名 语文 数学 英语 总成绩
 tom 60 60 60 180
kitty 90 95 87 272
 jack 72 84 99 255
总成绩 222 239 246 707

因为命令太长,末尾我用\符号换行了。。

  • BEGIN体里我输出了表头,并给四个变量初始化0
  • pattern体里我输出了每一行,并累加运算
  • END体里我输出了总统计结果
  • 当然了,一个正常人在用linux命令的时候是不会输入那么多格式化符号来对齐的,所以新命令又来了
  • column -t(鬼知道我为什么会记得这么多乱七八糟的命令。)

有用的内置变量

NF:表示当前行有多少个字段,因此$NF就代表最后一个字段

NR:表示当前处理的是第几行

FILENAME:当前文件名

OFMT:数字输出的格式,默认为%.6g。表示只打印小数点后6 位

$ awk -F ':' '{print NR ") " $1}' demo.txt
1) root
2) daemon
3) bin
4) sys
5) sync

内置函数

awk定义了很多内置函数,用awk来写shell脚本倒是一个不错的选择,但是大多数我们是用不上的,以下是常用函数

$ echo 1 2 | awk '{print $1+sqrt($2)}'
2.41421

随机数,先设置种子再随机

rand() 0 <= n < 1,srand([expr]) |将 rand 函数的种子值设置为 Expr 参数的值,或如果省略 Expr 参数则使用某天的时间。

$ echo 1 | awk 'BEGIN{srand()}{print rand()}'
0.929885

字符串

系统常用

不常用算数:

另外我们整理了一个学习知识库,你可以看一下:

【超全整理】《Linux云计算从入门到精通》系列实战笔记全放送 | Linux运维部落​

原文链接:http://www.magedu.com

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Jerry的SAP技术分享

如何处理错误消息Please install the Linux kernel header files

Please install the Linux kernel “header” files matching the current kernel

12150
来自专栏小网管运维之路

互联网运维安全总结

17620
来自专栏WalkingCloud

Linux下软RAID管理工具mdadm的基本操作实践

RAID (Redundant Array of Independent Disks独立磁盘冗余阵列) 是将多颗独立的硬盘整合成一个存储单元的数据存储技术。

23710
来自专栏Jerry的SAP技术分享

ABAP的HTTP_GET和Linux的curl

curl是利用URL语法在命令行方式下工作的开源文件传输工具,广泛应用在Unix,多种Linux发行版中。

9140
来自专栏Jerry的SAP技术分享

Docker镜像的目录存储讲解

版权声明:本文为博主汪子熙原创文章,未经博主允许不得转载。 https://jerry.bl...

8230
来自专栏量子位

越来越像Linux了!Windows系统5月更新让Python开箱即用

在Windows 10的CMD中输入python命令,你会得到什么?对不起,如果你没有自己安装过Python,系统将无法识别。

14630
来自专栏Jerry的SAP技术分享

在ubuntun虚拟机里安装goLang语言编程环境

版权声明:本文为博主汪子熙原创文章,未经博主允许不得转载。 https://jerry.bl...

12730
来自专栏Jerry的SAP技术分享

一个JSON字符串和文件处理的命令行神器jq,windows和linux都可用

这个命令行神器的下载地址:https://stedolan.github.io/jq/#

9340
来自专栏Golang开发

golang-101-hacks(11)——切片结构

切片有3部分组成 a)指针:指向底层数组中首位置; b)长度(类型为int):切片的有效元素个数; b)容量(类型为int):切片的容量。 看下面的代码...

9220
来自专栏Jerry的SAP技术分享

Red Hat Enterprise Linux(RHEL)中yum的repo文件详解

Yum(全称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及CentOS中的Shell前端软件包管理器。基于...

12160

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励