Linux下awk命令简介

Linux下awk命令简介转载自 http www zsythink net archives 1336 初识 awk 我们先来用专业的术语描述一下 awk 是什么 如果你看不懂 没关系 我们会再用 大白话 解释一遍 awk 是一个报告生成器 它拥有强大的文本格式化的能力 这就是专业的说法 你可能不理解所谓的报告生成器中的 报告 是什么 你可以把 报告 理解为 报表 或者 表格 也就是说 我们可以利用 awk 命令

转载自:http://www.zsythink.net/archives/1336/

初识awk

我们先来用专业的术语描述一下awk是什么,如果你看不懂,没关系,我们会再用”大白话”解释一遍。

awk是一个报告生成器,它拥有强大的文本格式化的能力,这就是专业的说法。

你可能不理解所谓的报告生成器中的”报告”是什么,你可以把”报告”理解为”报表”或者”表格”,也就是说,我们可以利用awk命令,将一些文本整理成我们想要的样子,比如把一些文本整理成”表”的样子,然后再展示出来,刚才概念中提到的”文本格式化的能力”,也就是这个意思,其实这样说可能还是不太容易理解,不用着急,当你看到后面的”示例”时,自然会明白awk所擅长的”文本格式化”能力是什么。

awk是由Alfred Aho 、Peter Weinberger 和 Brian Kernighan这三个人创造的,awk由这个三个人的姓氏的首个字母组成。

awk早期是在unix上实现的,所以,我们现在在linux的所使用的awk其实是gawk,也就是GNU awk,简称为gawk,awk还有一个版本,New awk,简称为nawk,但是linux中最常用的还是gawk。

Linux下awk命令简介

awk其实是一门编程语言,它支持条件判断、数组、循环等功能。所以,我们也可以把awk理解成一个脚本语言解释器。

grep 、sed、awk被称为linux中的”三剑客”。

我们总结一下这三个”剑客”的特长。

grep 更适合单纯的查找或匹配文本

sed  更适合编辑匹配到的文本

awk  更适合格式化文本,对文本进行较复杂格式处理

此处,我们只总结 awk

awk基础

awk基本语法如下,看不懂没关系,我们会慢慢举例。

awk [options] ‘program’ file1 , file2 , “`

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

awk [options] ‘Pattern{Action}’ file

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

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

Linux下awk命令简介

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

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

Linux下awk命令简介

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

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

Linux下awk命令简介

 

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

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

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

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

Linux下awk命令简介

同理,也可以一次性输出多个指定的列,如下图

Linux下awk命令简介

我们发现,第一行并没有第5列,所以并没有输出任何文本,而第二行有第五列,所以输出了。

除了输出文本中的列,我们还能够添加自己的字段,将自己的字段与文件中的列结合起来,如下做法,都是可以的。

Linux下awk命令简介

从上述实验中可以看出,awk可以灵活的将我们指定的字符与每一列进行拼接,或者把指定的字符当做一个新列插入到原来的列中,也就是awk格式化文本能力的体现。

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

Linux下awk命令简介

我们也可以输出整行,比如,如下两种写法都表示输出整行。

Linux下awk命令简介

我们说过,awk的语法如下

awk [options] ‘Pattern{Action}’ file

而且我们说过awk是逐行处理的, 刚才已经说过了最常用的Action:print

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

不过,我们准备先把awk中最特殊的模式展示给大家,以后再介绍普通的模式,因为普通模式需要的篇幅比较长,所以我们先来总结特殊模式。

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

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

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

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

Linux下awk命令简介

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

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

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

Linux下awk命令简介

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

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

Linux下awk命令简介

上图中,蓝色标注的部分表示BEGIN模式指定的动作,这部分动作需要在处理指定的文本之前执行,所以,上图中先打印出了”aaa bbb”,当BEGIN模式对应的动作完成后,在使用后面的动作处理对应的文本,即打印test文件中的第一列与第二列,这样解释应该比较清楚了吧。

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

Linux下awk命令简介

 

聪明如你一定明白了,END模式就是在处理完所有的指定的文本之后,需要指定的动作。

那么,我们可以结合BEGIN模式和END模式一起使用。示例如下

Linux下awk命令简介

 

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/231116.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 广州有哪些好点的软件外包公司或者软件开发公司呀?听说广州碧软还不错,还有其他靠谱的软件外包公司?

    广州有哪些好点的软件外包公司或者软件开发公司呀?听说广州碧软还不错,还有其他靠谱的软件外包公司?广州有哪些好点的软件外包公司或者软件开发公司呀?听说广州碧软还不错,还有其他靠谱的软件外包公司?广州碧软,做软件开发与外包还不错,我们和他们一直合作了好几年,不比那些超大型软件外包公司差,因为超大的软件外包公司公司他们也仅仅是一个分公司小部门来给你做项目,店大欺客啊,碧软他们规模中等,但用心,把该交付的东西做好很重要。…

    2022年5月8日
    129
  • windows shell命令大全_Windows shell

    windows shell命令大全_Windows shell
    http://www.d6pc.com/Html/?11152.html
     

    shell:Profile
      该命令可以打开用户的总目录。在常规安装的情况下,位置是c:/users/username。你也可以通过点击系统开始菜单上的用户名称访问。也可以通过系统环境变量%userprofile%访问。
    shell:Personal
      这个命令可以打开当前用户的文档文件夹。也可以通过点击开始菜单中的我的文档进行访问。
    shel

    2022年10月17日
    4
  • 计算机桌面图片怎么设置大小,怎么设置桌面壁纸大小[通俗易懂]

    计算机桌面图片怎么设置大小,怎么设置桌面壁纸大小[通俗易懂]很多人都知道怎麽设置电脑桌面,可真正找到适合自己屏幕的可能很少,图片或大或小,小编为大家分享了设置桌面壁纸大小的方法,下面大家跟着小编一起来了解一下吧。设置桌面壁纸大小方法先查看自己电脑屏幕分辨率,方法:依次打开控制面板\外观和个性化\显示\屏幕分辨率。查看图片的大小:单击图片,将鼠标放在图片图标上,就能看到尺寸。双击图片,用windows照片查看器打开,点击”打开“,选择画图。假设屏幕分辨率:…

    2022年5月15日
    170
  • 一个中文字符对应几个字节?

    一个中文字符对应几个字节?这个和字符编码有关。所谓字符编码,就是规定了如何将字符串转成byte[]。同一个汉字,在不同的字符编码下,得到的结果也不同。例如,”中国”GBK编码:D6D0B9FAUTF-8编码:E4B8ADE59BBD以GBK编码时,一个汉字得到2个字节。以UTF-8编码时,一个汉字得到2~3个字节。…

    2022年6月26日
    27
  • 基于R语言的分位数回归(quantile regression)

    基于R语言的分位数回归(quantile regression)分位数回归 quantileregr 这一讲 我们谈谈分位数回归的知识 我想大家传统回归都经常见到 分位数回归可能大家见的少一些 其实这个方法也很早了 大概 78 年代就有了 但是那个时候这个理论还不完善 到 2005 年的时候 分位数回归的创立者 KoenkerR 写了一本分位数回归的专著 剑桥大学出版社出版的 今年本来老爷子要出一本 handbookofqu

    2025年10月25日
    4
  • c++入门教程–-4运算符

    c++入门教程–-4运算符

    2021年3月12日
    152

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号