加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

文本数据处理之awk

发布时间:2020-12-14 04:00:39 所属栏目:大数据 来源:网络整理
导读:一、awk简介 ? ? ?awk 是一种优良的文本处理工具。 它不仅是 linux 中也是任何环境中现有的功能最强大的数据处理引擎之一。 awk提供了极其强大的功能:可以进行样式装入、流控制 、数学运算符 、进程控制语句 甚至于内置的变量 和函数。 最简单地说, awk 是

一、awk简介

? ? ?awk是一种优良的文本处理工具。它不仅是 linux 中也是任何环境中现有的功能最强大的数据处理引擎之一。 awk提供了极其强大的功能:可以进行样式装入、流控制、数学运算符、进程控制语句甚至于内置的变量和函数。最简单地说, awk 是一种用于处理文本的编程语言工具。

? ? ?awk与grep,sed是处理文本数据必不可缺且必须熟练的处理工具。

? ? ?grep : 文本过滤器

? ? ? sed:流编辑器

? ? ?awk : 报告生成器

二、awk的输出

? ? ?awk其输出格式有两种:print和printf

? ? ?print是简单的显示命令,printf 是格式化显示命令

1、print的使用格式

? ?print item1,item2,...

? ① 各项目之间使用逗号隔开,而输出时则以空白字符分隔;

? ② 输出的item可以为字符串或数值、当前记录的字段(如$1)、变量或awk的表达式;数值会先转换为字符串,而后再输出;

? ③ print命令后面的item可以省略,此时其功能相当于print $0,因此,如果想输出空白行,则需要使用print "";

? ?

2、printf的使用格式

? ? ? printf format,item1,...

?① 其与print命令的最大不同是,printf需要指定format;

?② format用于指定后面的每个item的输出格式;

? ? ? 每一个格式对应一个字段

?③ printf不会自动打印换行符;n

?

3、format

? format格式的指示符都以%开头,后跟一个字符;

? ① %c: 显示字符的ASCII码;

? ② %d,%i:十进制整数;

? ③ %e,%E:科学计数法显示数值;

? ④ %f: 显示浮点数;

? ⑤ %g,%G: 以科学计数法的格式或浮点数的格式显示数值;

? ⑥ %s: 显示字符串;

? ⑦ %u: 无符号整数;

? ⑧ %%: 显示%自身;

4、修饰符

? ① N: 显示宽度;

? ② -: 左对齐;

?

? ③ +:显示数值符号,默认为右对齐;

三、awk的变量

1、awk内置变量之记录变量:

? ? ? FS : field separator,读取文件本时,所使用字段分隔符;

? ? ? RS : Record separator,输入文本信息所使用的换行符;

? ? OFS : Output Filed Separator,文件分隔符;

? ? ORS:Output Row Separator,行分隔符;

? ?

2、awk内置变量之数据变量

? ? ?NR: The number of input records,awk命令所处理的记录数;如果有多个文件,这个数目会把处理的多个文件中行统一计数;

? ? ?NF:Number of Field,当前记录的field个数;

? ?

? ? ?FNR: 与NR不同的是,FNR用于记录正处理的行是当前这一文件中被总共处理的行数;

? ? ?ARGV: 数组,保存命令行本身这个字符串,如awk '{print $0}' a.txt b.txt这个命令中, ? ? ? ? ? ARGV[0]保存awk,ARGV[1]保存a.txt;

?

? ? ?ARGC: awk命令的参数的个数;

? ? ?FILENAME: awk命令所处理的文件的名称;

? ? ?ENVIRON:当前shell环境变量及其值的关联数组;

3、用户自定义变量

? ? ?gawk允许用户自定义自己的变量以便在程序代码中使用,变量名命名规则与大多数编程语言相同,只能使用字母、数字和下划线,且不能以数字开头。gawk变量名称区分字符大小写。

? ?① 脚本中赋值变量

? ? ?在gawk中给变量赋值使用赋值语句进行

? ?② 命令行中使用赋值变量

? ? ?gawk命令也可以在“脚本”外为变量赋值,并在脚本中进行引用。


四、输出重定向 ?1、 print items > output-file

? ? ? ?print items >> output-file

? ? ? ?print items | command ?2、特殊文件描述符:

? ? ? /dev/stdin:标准输入

? ? ? /dev/sdtout: 标准输出

? ? ? /dev/stderr: 错误输出

? ? ? /dev/fd/N: 某特定文件描述符


五、awk的操作符

?1、算术操作符:

? ? ? -x: 负值

? ? ?+x: 转换为数值;

? ?x^y: 次方

? ?x**y: 次方

? ? x*y: 乘法

? ?x/y:除法

? ?x+y: 加法

? ? x-y: 减法

? ?x%y: 取余

?2、字符串操作符:

? ?只有一个,而且不用写出来,用于实现字符串连接;

?3、赋值操作符: ? ? =、 +=、-=、*=、/=、%=、^=、**=、++、--

注:如果某模式为=号,此时使用/=/可能会有语法错误,应以/[=]/替代;

?4、布尔值

? ? ?awk中,任何非0值或非空字符串都为真,反之就为假, 与bash完全相反。

?5、比较操作符 ? ?x < y ?小于

? ?x <= y ?小于或等于

? ?x > y ?大于

? ?x >= y ?大于或等于

?

? ?x == y ?等于

? ?x != y ?不等于

? ?x ~ y ? 被匹配的字符

? ?x !~ y ?不被匹配的字符

?

?6、表达式间的逻辑关系符

? ?&& ? ?与

? ? | ?| ? ? 或

?

?7、条件表达式

? ?selector?if-true-exp:if-false-exp


if selector; then
 if-true-exp
else
 if-false-exp
fi


?8、函数调用

? ?function_name (para1,para2)

? ? 多个参数用逗号隔开

六、awk的输出模式

awk 'program' input-file1 input-file2 ...

? 其中的program为:

? ?pattern { action }

? ?......

? ?

?2、常见的模式类型

? ? Regexp: 正则表达式,格式为/regular expression/

? ? expresssion: 关系表达式,其值非0或为非空字符时满足条件,可以是字符串或数字的比较

? ? Ranges: 指定的匹配范围,格式为pat1,pat2

? ? BEGIN/END:特殊模式,仅在awk命令执行前运行一次或结束前运行一次

? ? BEGIN模式是 在真正处理之前做些准备工作的功能,END模式是 在运行之后输出相关信息。

?

? ? Empty(空模式):匹配任意输入行;

?3、常见的语句动作

? ? Expressions : ?表达式

? ? Control statements: 控制语句

? ? Compound statements : 组合语句

? ? Input statements : ?输入语句

? ? Output statements : 输出语句

七、控制语句

? 1、if-else

? 语法:if (condition) {then-body} else {[ else-body ]}

# awk -F: '{if ($1=="root") printf "%-15s: %sn",$1,"Admin"; else printf "%-15s: %sn","Common User"}' /etc/passwd

?

? 2、while

? ? 此while语句在awk中的作用体现是要么做成的循环体,要么在某个片上的循环

? 语法: while (condition){statement1; statment2; ...}

?

# awk -F: '{i=1;while (i<=3) {print $i;i++}}' /etc/passwd

?

? 3、do-while

? ? 与while语句不同之处在:不管条件真假先执行一次循环体,再执行控制语句

? 语法: do {statement1,statement2,...} while (condition)

?

# awk -F: '{i=1;do {print $i;i++}while(i<=3)}' /etc/passwd

?

? 4、for

? 语法: for ( variable assignment; condition; iteration process) { statement1,...}

?

# awk -F: '{for(i=1;i<=NF;i++) { if (length($i)>=4) {print $i}}}' /etc/passwd

?

? ? for循环还可以用来遍历数组元素

? 语法: for (i in array) {statement1,'microsoft yahei';color:#00B0F0;"> ?

# awk -F: '$NF!~/^$/{BASH[$NF]++}END{for(A in BASH){printf "%15s:%in",A,BASH[A]}}' /etc/passwd


? 5、case

? 语法:switch (expression) { case VALUE or /REGEXP/: statement1,... default: statement1,...}


? 6、break 和 continue

? ? 常用于循环或case语句中

? 7、 next ?

? 提前结束对本行文本的处理,并接着处理下一行

?

# awk -F: '{if($3%2==0) next;print $1,$3}' /etc/passwd


八、awk中使用的数组

? 1、数组

? ? ?array[index-expression]

? ? ?index-expression可以使用任意字符串;需要注意的是,如果某数据组元素事先不存在,那么在引用其时,awk会自动创建此元素并初始化为空串;因此,要判断某数据组中是否存在某元素,需要使用index in array的方式。

# netstat -ant | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a,S[a]}'

? 2、要遍历数组中的每一个元素,需要使用如下的特殊结构

? ? for (var in array) { statement1,... }

? ? 其中var用于引用数组下标,而不是元素值

? 3、删除数组变量

? ?从关系数组中删除数组索引需要使用delete命令。使用格式为

? ? delete ?array[index]

九、awk的内置函数

? 1、split(string,array [,fieldsep [,seps ] ])

? ?功能:将string表示的字符串以fieldsep为分隔符进行分隔,并将分隔后的结果保存至array为名的数组中;数组下标为从0开始的序列;

? 2、length([string])

返回string字符串中字符的个数;

? 3、substr(string,start [,length])

? ?功能:取string字符串中的子串,从start开始,取length个;start从1开始计数

? 4、system(command)

执行系统command并将结果返回至awk命令

? 5、systime()

? ?功能:取系统当前时间

? 6、tolower(s)

? ?功能:将s中的所有字母转为小写

? 7、toupper(s)

? ?功能:将s中的所有字母转为大写

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读