linux学习-awk工具

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux学习-awk工具相关的知识,希望对你有一定的参考价值。

    awk是基于列的文本处理工具,它的工作方式是按行读取文本并视为一条记录,每条记录以字段分割成若干字段,然后输出个字段的值,事实上,awk是一种编程语言。awk认为文件都是结构化的,也就是说由单词和各种空白字符组成的,这里的‘空白字符’包括空格,Tab,以及连续的空格和tab等。每个非空白的部分叫做域,从做到右依次是第一个域,第二个域,等等。$1、$2分别用于表示域,$0则表示全部域。

首先创建Awk.txt文件,文件内容如下所示:

john.wang	Male	30	021-1111111
lucy.yang	Female	25	021-2222222
jack.chen	Male	35	021-3333333
lily.gong	Female	20	021-4444444	ShangHai


打印指定域

    既然awk使用$1,$2代表不同的域,则可以打印指定域。拿Awk.txt的第一行来说,第一个域为john.wang,第二域为Male,第三个域为30,第四个域为021-1111111。在下面的演示中,第一条命令打印了$1、$4这两个域,而第二条命令打印了全部的域。

#只打印姓名和电话号码
awk '{print $1,$4}' Awk.txt

技术分享图片

#打印全部内容
awk '{print $0}' Awk.txt

技术分享图片


指定打印分隔符

    默认情况下awk是使用空白字符作为分隔符的,但是也可以通过-F指定分隔符,来区分不同的域

#指定“.”作为分隔符,这样每一行的$1就是“.”之前的字符,$2就是“.”之后的字符
比如说第一行的$1是"john",$2是"Male     30    02101111111"
awk -F. '{print $1,$2}' Awk.txt

技术分享图片


内部变量NF

    有时候文件很大,每行列数都不一样,必须通过特定的方式获取文件列数。通过awk的内部变量NF可以简单的做到这一点。当然,如果你指定了不同的分隔符,结果可能不一样。

#使用默认分隔符
awk '{print NF}' Awk.txt

技术分享图片

#使用指定分隔符
awk -F. '{print NF}' Awk.txt

技术分享图片

打印固定域

    通过内部变量可以简单的得到每行的列数,而如果在NF之前加上$符号,则代表的是“最后一列”,这样不管每行有多少列,只要使用$NF就能打印最后一行。

#打印最后一列
awk '{print $NF}' Awk.txt

技术分享图片

#打印倒数第二行
awk '{print $NF}' Awk.txt

技术分享图片


截取字符串

    可以使用substr()函数对指定域截取字符串,该函数的基本使用方法如下:

substr(指定域,第一个开始字符的位置,第二个结束的位置),其中第二结束的位置可以为空,这样默认的输出到该域的最后一个字符

下例将输出Awk.txt文件第一个域的第六个字符到最后一个字符的内容:

#注意,第二个结束位省略,所以结束位置为第一个域的最后一个字符
cat Awk.txt | awk '{print substr($1,6)}'

技术分享图片


确定字符串长度

    使用内部变量length可以确定字符串的长度,示例如下:

cat Awk.txt | awk '{print length}'

技术分享图片


使用awk求列和

        结构化的数据是非常常见的,在日常工作中,经常有将其中的数据进行相加的需求,以下为对Awk.txt中年龄进行的一些计算。请注意,年龄字段是第三个域。

#求年龄的和
cat Awk.txt | awk 'BEGIN{tolal=0}{total+=$3}END{print total}'
#求平均年龄
cat Awk.txt | awk 'BEGIN{tolal=0}{total+=$3}END{print total/NR}'


以上是关于linux学习-awk工具的主要内容,如果未能解决你的问题,请参考以下文章

Linux学习-awk使用

linux 中awk 学习随笔

2018-1-17 Linux学习笔记(awk)[重要]

Linux学习(二十五)正则表达式awk

[Linux Shell学习系列十四]sed和awk-5.awk基础

AWK 学习笔记