首页 > 其他分享 >awk介绍

awk介绍

时间:2022-10-24 16:15:27浏览次数:48  
标签:BEGIN 介绍 print awk test 文本 root

awk基础

awk基本语法如下,

awk [options] ‘program’ file

对于上述语法中的program来说,又可以细分成pattern和action,也就是说,awk的基本语法如下

awk [options] ‘Pattern{Action}’ file

从字面上理解 ,action指的就是动作,awk擅长文本格式化,并且将格式化以后的文本输出,所以awk最常用的动作就是print和printf,因为awk要把格式化完成后的文本输出啊,所以,这两个动作最常用。

我们先从最简单用法开始了解awk,我们先不使用[options] ,也不指定pattern,直接使用最简单的action,从而开始认识awk,示例如下

[root@test ~]# echo sss > test
[root@test ~]# awk '{print}' test
sss
[root@test ~]# 

我们只是使用awk执行了一个打印的动作,将test文件中的内容打印了出来。

好了,现在,我们来操作一下另一个类似的场景。

[root@test ~]# df
Filesystem              1K-blocks    Used Available Use% Mounted on
devtmpfs                  1887080       0   1887080   0% /dev
tmpfs                     1898696       0   1898696   0% /dev/shm
tmpfs                     1898696   49876   1848820   3% /run
tmpfs                     1898696       0   1898696   0% /sys/fs/cgroup
/dev/mapper/centos-root  19355648 3145972  16209676  17% /
/dev/sda1                  505580  259256    246324  52% /boot
/dev/sdb1                92757672   57368  87965432   1% /mnt
tmpfs                      379740       0    379740   0% /run/user/0
[root@test ~]# df | awk '{print $5}'
Use%
0%
0%
3%
0%
17%
52%
1%
0%
[root@test ~]# 

上图中的示例没有使用到options和pattern,上图中的awk ‘{print $5}’,表示输出df的信息的第5列,$5表示将当前行按照分隔符分割后的第5列,不指定分隔符时,默认使用空格作为分隔符,细心的你一定发现了,上述信息用的空格不止有一个,而是有连续多个空格,awk自动将连续的空格理解为一个分割符了,是不是比cut命令要简单很多,这样比较简单的例子,有利于我们开始了解awk。

awk是逐行处理的,逐行处理的意思就是说,当awk处理一个文本时,会一行一行进行处理,处理完当前行,再处理下一行,awk默认以”换行符”为标记,识别每一行,也就是说,awk跟我们人类一样,每次遇到”回车换行”,就认为是当前行的结束,新的一行的开始,awk会按照用户指定的分割符去分割当前行,如果没有指定分割符,默认使用空格作为分隔符。

$0 表示显示整行 ,$NF表示当前行分割后的最后一列($0和$NF均为内置变量)

注意,$NF 和 NF 要表达的意思是不一样的,对于awk来说,$NF表示最后一个字段,NF表示当前行被分隔符切开以后,一共有几个字段。

也就是说,假如一行文本被空格分成了7段,那么NF的值就是7,$NF的值就是$7,  而$7表示当前行的第7个字段,也就是最后一列,那么每行的倒数第二列可以写为$(NF-1)。

我们也可以一次输出多列,使用逗号隔开要输出的多个列,如下,一次性输出第一列和第二列

[root@test ~]# cat test
asd asd1  123tw 
zxcsfa
asdzxcga asdqeqe zxcseq zxca
666 4555 333 222
[root@test ~]# awk '{print $1,$2}' test
asd asd1
zxcsfa 
asdzxcga asdqeqe
666 4555
[root@test ~]# 

但是要注意,$1这种内置变量的外侧不能加入双引号,否则$1会被当做文本输出,示例如下

[root@test ~]# awk '{print "$1",$2}' test
$1 asd1
$1 
$1 asdqeqe
$1 4555

现在,我们来认识下一Pattern,也就是我们所说的模式

AWK 包含两种特殊的模式:BEGIN 和 END。

BEGIN 模式指定了处理文本之前需要执行的操作:

END 模式指定了处理完所有行之后所需要执行的操作:

什么意思呢?光说不练不容易理解,我们来看一些小例子,先从BEGIN模式开始,示例如下

[root@test ~]# awk 'BEGIN{print "aaa","bbb"}' test
aaa bbb

上述写法表示,在开始处理test文件中的文本之前,先执行打印动作,输出的内容为”aaa”,”bbb”.

也就是说,上述示例中,虽然指定了test文件作为输入源,但是在开始处理test文本之前,需要先执行BEGIN模式指定的”打印”操作

既然还没有开始逐行处理test文件中的文本,那么是不是根本就不需要指定test文件呢,我们来试试。

[root@test ~]# awk 'BEGIN{print "aaa","bbb"}'
aaa bbb

经过实验发现,还真是,我们并没有给定任何输入来源,awk就直接输出信息了,因为,BEGIN模式表示,在处理指定的文本之前,需要先执行BEGIN模式中指定的动作,而上述示例没有给定任何输入源,但是awk还是会先执行BEGIN模式指定的”打印”动作,打印完成后,发现并没有文本可以处理,于是就只完成了”打印 aaa bbb”的操作。

这个时候,如果我们想要awk先执行BEGIN模式指定的动作,再根据执我们自定义的动作去操作文本,该怎么办呢?示例如下

[root@test ~]# awk 'BEGIN{print "aaa","bbb"}{print $1,$2}' test
aaa bbb
asd asd1
zxcsfa 
asdzxcga asdqeqe
666 4555

看完上述示例,似乎更加容易理解BEGIN模式是什么意思了,BEGIN模式的作用就是,在开始逐行处理文本之前,先执行BEGIN模式所指定的动作。以此类推,END模式的作用就一目了然了,举例如下。

[root@test ~]# awk 'END{print "aaa","bbb"}{print $1,$2}' test
asd asd1
zxcsfa 
asdzxcga asdqeqe
666 4555
aaa bbb

上述示例中返回的结果有没有很像一张”报表”,有”表头”  、”表内容”、  “表尾”,awk对文本的格式化能力你体会到了吗?

大家快来一起学习 文本处理工具 awk,缺乏机器练手的小伙伴可以去 cnaaa 看一看!

标签:BEGIN,介绍,print,awk,test,文本,root
From: https://www.cnblogs.com/pangdahaiaaa/p/16821744.html

相关文章

  • 复合事件处理(Complex Event Processing)介绍
    复合事件是由史丹佛大学的DavidLuckham与BrianFraseca所提出,DavidLuckham与BrianFraseca于1990年提出复合事件架构,使用模式比对、事件的相互关系......
  • sed介绍
    1、sed介绍   sed全名为streameditor,流编辑器,用程序的方式来编辑文本,功能相当的强大。是贝尔实验室的LeeE.McMahon在1973年到1974年之间开发完成,目前可以在......
  • 【kubernetes入门到精通】Kubernetes架构分析介绍篇「进阶篇」
    意志的出现不是对愿望的否定,而是把愿望合并和提升到一个更高的意识水平上。——罗洛·梅官方网站​​Kubernetes中文官方网站​​​​Kubernetes英文官方网站​​Kubernetes......
  • 对象的常用方法Object.values()的使用介绍(小白级别)
    对象的常用方法Object.values​​方法解析​​​​使用代码示例​​​​其他用法​​方法解析Object.values()参数:对象返回值:一个数组返回的数组的内容是传入的对象中所有......
  • Prometheus之Alertmanager介绍
    一告警功能概述Prometheus对指标的收集、存储同告警能力分属于PrometheusServer和Alertmanager连个独立的组件,前者仅负责基于告警规则生成告警通知,具体的告警操作则由后者......
  • HTML概念介绍和HTML快速入门
    HTML概念介绍:1.概念∶是最基础的网页开发语言HyperTextMarkupLanguage超文本标记语言超文本:超文本是用超链接的方法,将各种不同空间的文字信息组织......
  • 概念介绍_软件架构和概念介绍_资源分类
    概念介绍_软件架构:web概念概述Javaweb:使用iava语言开发基于互联网的项目软件架构∶1.c/s:client/server客户端/服务器端在用户本地有一个客户端程序,在远程有一个......
  • 数据库连接池_概述与数据库连接池_实现介绍
    数据库连接池_概述数据库连接池概念:其实就是一个容器(集合),存放数据库连接的容器当系统初始化好后,容器被创建,容器中会申......
  • AI&BlockChain:“知名博主独家讲授”人工智能创新应用竞赛【精选实战作品】之《基于计
    AI&BlockChain:“知名博主独家讲授”人工智能创新应用竞赛【精选实战作品】之《基于计算机视觉、自然语言处理和区块链技术的乘客智能报警系统》案例的界面简介、功能介绍分......
  • 持续集成(CI)简单介绍
    Continuousintegration,简称CI​是一种软件开发实践,即团队开发成员经常集成他们的工作,通常每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过......