写点什么

Linux 三剑客之 awk(2):awk 模块、变量与执行

  • 2020-02-10
  • 本文字数:2035 字

    阅读完需:约 7 分钟

Linux三剑客之awk(2):awk模块、变量与执行

完整 awk 结构图如下:


1560755355824033606.png

一、BEGIN 模块

BEGIN 模块在 awk 读取文件之前就执行,BEGIN 模式常常被用来修改内置变量 ORS,RS,FS,OFS 等的值。可以不接任何输入文件

二、awk 内置变量(预定义变量)

变量名属性
$0当前记录,一整行
$1,$2,$3…$a当前记录的第n个区域,区域间由FS分隔。
FS输入区域分隔符,默认是空格。field separator
NF当前记录中的区域个数,就是有多少列。number of field
NR已经读出的记录数,就是行号,从1开始。number of record
RS输入的记录分隔符默认为换行符。record separator
OFS输出区域分隔符,默认也是空格。output record separator
FNR当前文件的读入记录号,每个文件重新计算。
FILENAME当前正在处理的文件的文件名


特别提示:FS RS 支持正则表达式

2.1 第一个作用: 定义内置变量


[root@creditease awk]# awk 'BEGIN{RS="#"}{print $0}' awk.txt ABC DEF GHI GKL$123 BAC DEF GHI GKL$213 CBA DEF GHI GKL$321
复制代码

2.2 第二个作用:打印标识


[root@creditease awk]# awk 'BEGIN{print "=======start======"}{print $0}' awk.txt =======start====== ABC#DEF#GHI#GKL$123 BAC#DEF#GHI#GKL$213 CBA#DEF#GHI#GKL$321
复制代码

2.3 awk 实现计算功能


[root@creditease files]# awk 'BEGIN{a=8;b=90;print a+b,a-c,a/b,a%b}' 98 8 0.0888889 8
复制代码

三、END 模块

END 在 awk 读取完所有的文件的时候,再执行 END 模块,一般用来输出一个结果(累加,数组结果)。也可以是和 BEGIN 模块类似的结尾标识信息。

3.1 第一个作用:打印标识


[root@creditease awk]# awk 'BEGIN{print "=======start======"}{print $0}END{print "=======end======"}' awk.txt =======start====== ABC#DEF#GHI#GKL$123 BAC#DEF#GHI#GKL$213 CBA#DEF#GHI#GKL$321 =======end======
复制代码

3.2 第二个作用:累加

1)统计空行(/etc/services 文件)


grep sed awk



[root@creditease awk]# grep "^$" /etc/services |wc -l 17 [root@creditease awk]# sed -n '/^$/p' /etc/services |wc -l 17 [root@creditease awk]# awk '/^$/' /etc/services |wc -l 17 [root@creditease awk]# awk '/^$/{i=i+1}END{print i}' /etc/services 17
复制代码


2)算术题


1+2+3…+100=5050,怎么用 awk 表示?



[root@creditease awk]# seq 100|awk '{i=i+$0}END{print i}' 5050
复制代码

四、awk 详解小结

1、BEGIN 和 END 模块只能有一个,BEGIN{}BEGIN{}或者 END{}END{}都是错误的。


2、找谁干啥模块,可以是多个。

五、awk 执行过程总结

1560755367438038139.png


awk 执行过程:


1、命令行的赋值(-F 或-V)


2、执行 BEGIN 模式里面的内容


3、开始读取文件


4、判断条件(模式)是否成立


  • 成立则执行对应动作里面的内容

  • 读取下一行,循环判断

  • 直到读取到最后一个文件的结尾


5、最后执行 END 模式里面的内容


**◆ ◆ ◆ ◆ ◆**


发现文章有错误、对内容有疑问,都可以通过关注宜信技术学院微信公众号(CE_TECH),在后台留言给我们。我们每周会挑选出一位热心小伙伴,送上一份精美的小礼品。快来扫码关注我们吧!********


本文转载自宜信技术学院网站。


原文链接:http://college.creditease.cn/detail/261


2020-02-10 21:091368

评论

发布
暂无评论
发现更多内容

工赋开发者社区 | 某大型电子装备总装数字化工厂MES/MOM系统实施

工赋开发者社区

工赋开发者社区 | 当PLC与见“IT”:MES/MOM标准之ISA-95基础内容介绍

工赋开发者社区

开发者有话说|程序猿工作多年之后的感悟

慕枫技术笔记

个人成长

16个分论坛出品标准大揭秘,期待你的申请!

开源社

​Java进阶(三十九)Java集合类的排序,查找,替换操作

No Silver Bullet

Java 排序 查找 10月月更 替换

计算机网络——以太网交换机学习和转发帧

StackOverflow

编程 计算机网络 10月月更

Python基础(七) | 文件、异常以及模块详解

timerring

异常 模块 10月月更

数组操作の旋转二维数组

掘金安东尼

算法 10月月更

大数据ELK(十):使用VSCode操作猎聘网职位搜索案例

Lansonli

ELK 10月月更

戏说系统安全(50/100)

hackstoic

系统安全

这些js原型及原型链面试题你能做对几道

loveX001

JavaScript

【牛客刷题-算法】2-算法入门-栈的压入、弹出序列

清风莫追

算法 10月月更

【牛客刷题-算法】3-第一篇-斐波拉契数列-C实现

清风莫追

递归 数据结构与算法、 10月月更

匿名网络追踪溯源机制及方法

郑州埃文科技

IP地址 追踪溯源 匿名网络

面试官:高并发场景下,你们是怎么保证数据的一致性的?

一灯架构

Java MySQL 10月月更

ESP32-C3 学习测试 蓝牙 篇(五、添加 characteristic)

矜辰所致

蓝牙 ESP32-C3 10月月更

Docker下,五分钟极速体验机器学习

程序员欣宸

Docker 10月月更

【LeetCode】在LR字符串中交换相邻字符Java题解

Albert

LeetCode 10月月更

Python基础(六) | 面向对象类定义及特性详解

timerring

实例 10月月更

MyBatis学习笔记之JDBC

薛定谔的猫

mybatis JDBC 10月月更

简述构建微服务架构的四大挑战

穿过生命散发芬芳

微服务 10月月更

Collections-Arraylist源码解读(一)

知识浅谈

ArrayList 10月月更

JavaScript中this指向哪儿?如何确定this?-前端面试进阶

loveX001

JavaScript

乐观锁和悲观锁

潜水员

并发

如何打通 SAP Cloud for Customer 系统和微信公众号的双向消息通信功能

汪子熙

node.js 微信 SAP 微信平台 10月月更

Web3.0杂谈-#004(51/100)

hackstoic

NFT Web3.0

你是如何使用React高阶组件的?

beifeng1996

React

【牛客刷题-算法】NC4 判断链表中是否有环

清风莫追

算法 10月月更

用任意类型编写代码——一文带你了解泛型编程

宇宙之一粟

Java 泛型编程 10月月更

​Java进阶(三十八)快速排序

No Silver Bullet

Java 快速排序 10月月更

计算机网络——集线器与交换机的区别

StackOverflow

编程 计算机网络 10月月更

Linux三剑客之awk(2):awk模块、变量与执行_开源_秦伟_InfoQ精选文章