shell工具篇之awk

来源:互联网 发布:个体户注册域名 编辑:程序博客网 时间:2024/06/14 03:47


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

  • awk是文本处理工具,不仅能以行为单位处理文件还能以列为单位处理文件;
  • awk默认行分隔符为'\n' ,列分隔符默认为连续的空格或tab,但是行分隔符和列分隔符都是可以自定义的;
  • awk还是一门很复杂的脚本语言,具有类C一样的分支和循环结构。
2.awk命令格式
  
awk命令的基本格式:awk  option  'script'  file1 file2 ...awk  option  -f   scriptfile  file1  file2...

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

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

(1)下面先举一个例子来说明 $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

     


4.shell脚本方式

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

注意,如果蛇棒位置没有-f ,那么执行时就要在命令行上加上,前面我们也介绍了,-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中的数组用来从记录中收集信息,可以用于计算总和、统计单词以及跟踪模板被匹配的次数等等。





原创粉丝点击