shell工具之awk

来源:互联网 发布:王宝强剧情反转知乎 编辑:程序博客网 时间:2024/06/07 16:20

1.了解awk必须要知道的三点:

  >awk是文本处理工具,不仅能以行为单位处理文件还能以列为单位处理文件;
  >awk默认行分隔符为’\n’ ,列分隔符默认为连续的空格或tab,但是行分隔符和列分隔符都是可以自定义的;
  >awk还是一门很复杂的脚本语言,具有类C一样的分支和循环结构。

2.awk命令格式

<span style="font-size:14px;">awk命令的基本格式:
awk option 'script' file1 file2 ...
awk option -f scriptfile file1 file2...
</span>

和sed一样,awk处理的文件既可以由标准输入重定向得到,也可以当命令行参数传入;编辑命令可以直接当命令行参数传入,也可以用 -f 参数指定一个脚本文件。

<span style="font-size:14px;">编辑命令的格式为: /pattern/{actions}
和sed类似,pattern是正则表达式,actions是一系列操作。awk程序一⾏行读出待处理文件,如果某一行与pattern匹配,或者满足condition条件,则执行相应的actions,如果一条awk命令只有actions部分,则actions作用于待处理文件的每一行。</span>

(1)下面先举一个例子来说明$1,$2,$0等代表的含义:
这里写图片描述

可以看出$1打印文件中的第一列,$2 打印文件中的第二列,$0 打印文件整个当前行。

再比如:
这里写图片描述

从上面的例子中我们得出:
自动变量$1、$2分别表示第一列、第二列等,类似于Shell脚本的位置参数,而$0表示整个当前行。

(2)自定义列分隔符,用 -F参数
这里写图片描述

awk默认的列分隔符是连续的空格或tab,在指定分隔符后可按指定的分隔符来划分列。

(3)awk还有一个NF变量,它是自动获取最后一列的,如下图:
这里写图片描述

可见awk也有和C语言非常相似的printf函数. 用print输出时,当我们需要输出多个变量时,每个变量之间用逗号隔开即可,如果输出的是字符串要以双引号括起来:
这里写图片描述

总结一下awk中的print和printf:
  (1)其中print函数的参数可以是变量、数值或者字符串。字符串必须用双引号引用,参数用逗号分隔。如果没有逗号,参数就串联在一起而无法区分。这里,逗号的作用与输出文件的分隔符的作用是一样的,只是后者是空格而已。
  (2)printf函数,其用法和c语言中printf基本相似,可以格式化字符串,输出复杂时,printf更加好⽤用,代码更易懂。


3.awk命令的condition部分还可以是两个特殊的BEGIN和END

awk处理文件分三个阶段:处理前,处理中,处理后。而BEGIN是处理之前执行的动作,END是处理后执行的动作。
用法格式: BEGIN{action},END{action}
  (1)在输出文件内容之前先输出begin,在处理完文件之后输出end;
这里写图片描述

  (2)awk命令可以像C语言一样使用变量(但不需要定义变量),因为awk也是一门弱类型语言,所以它的变量可以随处定义,而且不需要类型。比如统计一个文件中的空行数,这里就用到END
这里写图片描述

这里写图片描述

上图中/^ *$/ 匹配空行,匹配到变量就计数一次,END{print x;} 在最后一行打印出该变量的值。


4.shell脚本方式

  将所有的awk命令插入一个文件,并使awk程序可执行,然后awk命令解释器作为脚本的首行,一遍通过键入脚本名称来调用。相当于shell脚本首行的:#!/bin/sh 可以换成:#!/bin/awk -f
这里写图片描述

5.awk通用正则表达方法

  (1)awk语句:awk ‘/REG/{action}’
/REG/为正则表达式,可以将$0中,满足条件记录 送到action进行处理
  (2)awk正则运算语句(〜,〜!等同!〜)
  (3)awk内置使用正则表达式函数

gsub( Ere, Repl, [ In ] )
sub( Ere, Repl, [ In ] )
match( String, Ere )
split( String, A, [Ere] )

6.awk的内置变量

ARGC 命令行参数个数
ENVIRON 支持队列中系统环境变量的使用
FILENAME awk浏览的文件名
FNR 浏览文件的记录数
FS 设置输入域分隔符,等价于命令行 -F选项
NF 浏览记录的域的个数
NR 已读的记录数
OFS 输出域分隔符
ORS 输出记录分隔符
RS 控制记录分隔符

7.通过awk实现1–100求和的运算

这里写图片描述

awk中的循环语句同样借鉴于C语⾔,支持while、do/while、for、break、continue,这些关键字的语义和C语言中的语义完全相同。


8.awk数组(有兴趣的同学可以自己去详细了解一下,这里不做过多描述)

  awk中数组的下标可以是数字和字母,数组的下标通常被称为关键字(key)。值和关键字都存储在内部的一张针对key/value应用hash的表格里。由于hash不是顺序存储,因此在显示数组内容时会发现,它们并不是按照你预料的顺序显示出来的。数组和变量一样,
都是在使用时自动创建的,awk也同样会自动判断其存储的是数字还是字符串。一般而言,awk中的数组用来从记录中收集信息,可以用于计算总和、统计单词以及跟踪模板被匹配的次数等等。

原创粉丝点击