一、awk简介

awk是一个非常好用的数据处理工具,相对于sed常常作用于一整个行的处理,awk则比较倾向于一行当中分成数个【字段】处理,因此,awk相当适合处理小型的数据数据处理。awk是一种报表生成器,就是对文件进行格式化处理的,这里的格式化不是文件系统的格式化,而是对文件内容进行各种“排版”,进而格式化显示;在linux中我们使用的是GNU awk简称gawk,并且gawk其实就是awk的链接文件,因此在系统上使用awk和gawk是一样的。


二、awk的基本用法

awk[OPTIONS]'program' FILE1 FILE2

program:PATTERN{ACTION STATEMENT}

program:编程语言 PATTERN:模式 ACTIONSTATEMENT:动作语句,可以是多个语句,但多个语句中间要使用分号分隔

OPTIONS:-F[] 指明输入字段分割符 ; -v VALUE 变量赋值;

举例说明:

cat /etc/passwd
 

cat ceshi.txt |awk -v FS: '{print $1,$3}'(每行按冒号分割,输出第一个域和第三个域;默认为空格分割;注意:awk后续动作都要以单引号引起来)
 

cat ceshi.txt |awk -v FS: '{print $1"XXXX"$3}'("XXXX"代表任意内容,必须用双引号引起来)
 


三、变量

1、内建变量

  • FS 输入字段分隔符,默认为空白

  • RS 输入的记录分隔符,默认为换行符

  • OFS 输出字段分割符,默认为空白字符

  • OFS 输出字段分隔符,默的认为换行符

  • NF 当前行的字段的数量

  • print NF 显示当前行的字段数

  • print $NF 显示当前行的第NF字段的值

  • NR 记录号

  • FNR 个文件分别计数,显示行号

  • FILENAME 当前文件名

  • ARGC 命令行参数的个数

  • ARGV 保存命令行所给定的各参数的数组

2、自定义变量

(1)-v VALUE (变量名称区分大小写)在这里文件ceshi.txt中有多少行就显示多少行变量的值

awk -v fan="cool"  '{print fan}' ceshi.txt
 

(2)在program中自定义变量

awk 'BEGIN{FS=":";abc=1}{print $abc}' ceshi.txt
 


四、awk的格式化输出

语法 printf FORNAT,item1,item2

  • FORMAT必须提供

  • 与print语句不同,printf不会自动换行,需要使用换行符\n

  • FORMAT中需要分别为后面的每个item指定一个格式符,否则item无法显示;

格式符介绍:

  • %c 显示字符的ASCII码

  • %d ,%i 显示为十进制整数

  • %e,%E 科学技术法显示数值

  • %f 显示为浮点数

  • %g,%G 以科学技术法或浮点数格式显示数值

  • %s 显示为字符串

  • %u 显示无符号整数

  • %% 当需要显示%号时需要连续打两个百分号

举例说明:

cat ceshi.txt |awk -F: '{printf "%-10s%s\n",$1,$3}'
 


五、awk的操作符

  • 算术操作符     如:A+B A-B A*B A/B

  • 字符操作符     字符串链接

  • 赋值操作符     如:== += /= %=

  • 比较操作符     如:> >= < <=

  • 模式匹配操作符  ~ 是否能由右侧指定的模式所匹配  !~是否不能由右侧指定的模式所匹配

  • 逻辑操作符     && 与运算 || 或运算

  • 条件表达式     selector?if-true-expression:if-ials-expreion

  • 函数调用        调用函数来进行数据的处理

举例说明

通过df命令查看当前系统磁盘占用率,查出占用率大于等于百分之20的磁盘名称以及磁盘占用率

df|awk -v FS=% '$0 ~ "/dev/sd" {print $1}'|awk '$NF>=20 {printf "DevName:%-10s Used:%s%%\n",$1,$5}'
 

awk -v FS=: '{$3>=5?usertype="Big User":usertype="Small User";printf "UserName:%-15s Type:%s\n",$1,usertype}' ceshi.txt
 


六、awk的控制语句

  • if(condition){statements}[else {statement}]

awk -F: '{if($3>=5){printf "%-10s%s\n",$1,$3}}' ceshi.txt
 

  • while循环 while(condition){statements}

echo {1..10} |awk '{n=1;while(n<=NF){if($n%2==0){print $n,"oushuo"}else {print $n,"jishu"};n++}}'
 

  • do-while循环

  • for循环

awk BEGIN'{for(i=1;i<=1000;i++){sum+=i};print sum}'
 

  • break

  • continue

  • delete array

  • exit

  • next     提前结束对本行文本的处理,而提前进入下一行的处理操作

awk -F: '{if($3%2==0)next;print $1,$3}' ceshi.txt
 


七、awk的性能测试

实验:从1加到100等于多少?

(1)time seq -s "+" 5000000 |bc

(2)time awk BEGIN'{for(i=1;i<=1000000;i++){sum+=i};print sum}'

(3)time awk BEGIN'{i=1;while(i<=1000000){sum+=i;i++};print sum}'

(4)time for ((i=1;i<=1000000;i++));do let sum+=i; done;echo $sum


八、awk数组

数组是一个包含一系列元素的表

格式如下:

abc[1]="libai"

abc[2]="lihei"

abc为数组名,[1][2]为数组下标,可以认为是数组的第一个元素,第二个元素,"libai""lihei"是元素的内容

举例说明:

awk 'BEGIN{fan[0]="libai";fan[1]="lihei";print fan[0]}'
 
awk 'BEGIN{fan[0]="libai";fan[1]="lihei";print fan[1]}'
 

awk 'BEGIN{fan[0]="libai";fan[1]="lihei";for (i in fan)print i}'
 

awk -F: '{{fan[NR]=$1;}{print NR,fan[NR]}}' ceshi.txt
 

利用数组统计每个ip地址访问量(编辑一个文件,该文件存储ip地址)

awk '{array[$1]++} END {for(key in array) print array[key],key}' a|sort -r
 

关于array[$1]++

(1)awk在读取第一行的时候,会读取这个数组,此时的数组是这样的,array["第一行的内容"]++

(2)此时该数组的值还没有定义,但后面有运算符号++,所以awk会将数字0自动赋值给array["第一行的值"]做++运算,所以得到的值为1.

(3)在读到与array["第一行的内容"]相同的时候继续++运算,也就意味着,运算了多少次,就是出现了多少次。


九、awk函数

1、内键函数

(1)数值处理 rand() 返回0至1之间的一个随机数

awk 'BEGIN{print rand()}'
 

从这张图中我们发现了一个问题,通过使用rand函数生成随机数,但是rand函数返回的值一直不变,所以我们需要配合srand函数

awk 'BEGIN{srand();print rand()}'
 

从这张图中我们发现生成的随机数产生了变化,但生成的随机数都是小于1的小数,如果我们想要生成整数随机数,我们可以利用int整数函数截取整数部分的值

awk 'BEGIN{srand();print 100*rand()}'
 
awk 'BEGIN{srand();print int(100*rand())}'
 

(2)字符串函数

length([s]) 返回指定的字符串的长度

举例说明

awk '{print $0 length()}' abc.txt (每一行全部字符长度)
 

awk '{for(i=1;i<=NF;i++){print $i,length($i)}}' abc.txt(指定字符长度)
 

gsub(r,s[,t])基于r所表示的模式来匹配字符串t中的内容,将其所有被匹配到的内容均替换为s所表示的字符串

举例说明

awk '{gsub("h","H",$1);print $0}' abc.txt
 

awk '{gsub("h","H",$0);print $0}' abc.txt
 

sub(r,s[,t]) 基于r所表示的模式来匹配字符串t中的内容,将其第一次被匹配到的内容替换为s所表示的字符串

举例说明

awk '{sub("h","H");print $0}' abc.txt(只替换指定范围第一次匹配到的符合条件的字符)
 

split(s,a[,r]) 以r为分隔符去切割字符串s,并将切割后的结果保存至a表示的数组中

举例说明

awk -v aa="李大;李二;李三" 'BEGIN{split(aa,lishijiazu,";");for(i in lishijiazu){print lishijiazu[i]}}'
 

awk -v aa="cc;ff;dd;ee" 'BEGIN{split(aa,lishijiazu,";");for(i in lishijiazu){print lishijiazu[i]}}'
 

从上图中我们发现数组元素输出顺序可能与字符串中字符的顺序不同,我们可以采用下面的办法

awk -v aa="cc;ff;dd;ee" 'BEGIN{ abc=split(aa,lishijiazu,";");for(i=1;i<=abc;i++){print i,lishijiazu[i]}}'
 

2、用户自定义函数

函数是程序的基本组成部分,awk允许我们定义自己的函数,一个大的程序可以分为多个函数并且每个函数可以独立测试

用户自定义函数的一般格式为:

function function_name(argument1,argument2,...)
{
function body
}
 

function_name是用户定义函数的名称,函数名称应以字符的字母并且其余部分可以是数字,字母或下划线的任意组合,awk的保留字不能用作函数名字;函数可以接受以逗号分隔的多个参数,参数不是强制性的,我们也可以创建一个用户定义的函数不带任何参数;函数体由一个或多个awk语句组成。

原文出处:https://blog.51cto.com/13866901/2166164?tdsourcetag=s_pctim_aiomsg

linux中awk 详解的更多相关文章

  1. 什么是挂载?linux中挂载详解

    目录 一:什么是挂载,linux中挂载详解 一:什么是挂载,linux中挂载详解 1.linux中'一切皆文件',所有文件都放置在以根目录为树根的树形目录结构中.在linux看来,任何硬件设备也都是文 ...

  2. linux 中/proc 详解

    proc 文件系统 在Linux中有额外的机制可以为内核和内核模块将信息发送给进程-- /proc 文件系统.最初设计的目的是允许更方便的对进程信息进行访问(因此得名),现在它被每一个有有趣的东西报告 ...

  3. Linux中挂载详解以及mount命令用法

    转自:https://blog.csdn.net/daydayup654/article/details/78788310 挂载概念 Linux中的根目录以外的文件要想被访问,需要将其“关联”到根目录 ...

  4. 【转载】postgreSQL在linux中安装详解

    .编译环境 Linux: CentOS 5.5 gcc: 4.1.2 1. 安装PostgreSQL 1) 解压postgresql-9.1.7.tar.bz2 #tar jxvf postgresq ...

  5. Linux中inode详解

    转自:https://www.cnblogs.com/itech/archive/2012/05/15/2502284.html 一.inode是什么? 理解inode,要从文件储存说起. 文件储存在 ...

  6. Linux下Awk详解(转载)

    什么是Awk Awk是一种小巧的编程语言及命令行工具.(其名称得自于它的创始人Alfred Aho.Peter Weinberger 和 Brian Kernighan姓氏的首个字母).它非常适合服务 ...

  7. Linux 中 crontab 详解及示例

    cron是一个linux下的定时执行工具,可以在无需人工干预的情况下运行作业.由于Cron 是Linux的内置服务,但它不自动起来,可以用以下的方法启动.关闭这个服务: /sbin/service c ...

  8. linux中sleep详解实例

    在linux编程中,有时候会用到定时功能,常见的是用sleep(time)函数来睡眠time秒:但是这个函数是可以被中断的,也就是说当进程在睡眠的过程中,如果被中断,那么当中断结束回来再执行该进程的时 ...

  9. linux中nc详解

    |是管道符号,表示左边的输出作为右边的输入. 1.TCP端口扫描 # nc -v -z -w2 127.0.0.1 1-100 Connection to 127.0.0.1 22 port [tcp ...

随机推荐

  1. PHPstorm Xdebugger最全详细

    0 Xdebug调试的原理(选看) 图0-1 单机调试原理示意图 图0-2 多机调试原理示意图 对于PHP开发,初来咋到,开发环境的搭建和理解感觉是最烦人的一件事了.不像JAVA,打开一个Eclips ...

  2. 第四周课程总结&试验报告

    实验二 Java简单类与对象 实验目的 掌握类的定义,熟悉属性.构造函数.方法的作用,掌握用类作为类型声明变量和方法返回值: 理解类和对象的区别,掌握构造函数的使用,熟悉通过对象名引用实例的方法和属性 ...

  3. 加密算法:DES、AES等

    指标:运算速度.安全性.资源消耗 对称加密算法(加解密密钥相同): 非对称算法(加密密钥和解密密钥不同): 散列算法比较: 对称与非对称算法比较: 算法选择(从性能和安全性综合) 对称加密: AES( ...

  4. HDFS网络拓扑概念及机架感知(副本节点选择)

    网络拓扑概念 在本地网络中,两个节点被称为“彼此近邻”是什么意思?在海量数据处理中,其主要限制因素是节点之间数据的传输速率——带宽很稀缺.这里将两个节点间的带宽作为距离的衡量标准. 节点距离:两个节点 ...

  5. webpack4 es6转换

    在webpack里用es6语法, ie浏览器不识别,为了让浏览器识别,需要用到bebal转换; bebal,英文是通天塔 的意思, 我们常说的巴比伦也是这个词;我估计是当初设计者是想用它作为一个沟通e ...

  6. [BZOJ1074] [luogu 4036] [JSOI 2008] 火星人 (二分答案+哈希+fhq treap)

    [BZOJ1074] [luogu 4036] [JSOI 2008] 火星人 (二分答案+哈希+fhq treap) 题面 给出一个长度为n的字符串,m个操作,字符串仅包含小写英文字母 操作1:在k ...

  7. 1.go语言目录结构

    [root@localhost ~]# ll /go/ total drwxr-xr-x. root root May : api -rw-r--r--. root root May : AUTHOR ...

  8. osi七层协议 Open System Interconnection

    一, 操作系统基础 操作系统:(Operating System,简称OS)是管理和控制计算机硬件与软件资源的计算机程序,是直接运行在"裸机"上的最基本的系统软件,任何其他软件都必 ...

  9. python字符串的运算有哪些

    python字符串的运算有哪些 1,链接符号 + 2,判断字符串是否在某个字符串中 ‘s’ in ‘this’ 返回bool 3,字符串索引 a="this a my" a[0], ...

  10. 你浏览器的书签栏还够用么? - 程序员学点xx 特辑

    lluxury 运维开发时间 为什么会想到这个话题,是因为最近看到的一条广告:注册 xx 送2048GB资料.yann 暗自感慨:"都9012年了,还有人分享家里的祖传硬盘".2T ...