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工具的主要内容,如果未能解决你的问题,请参考以下文章