Linux常用命令awk

AWK是一种优良的文本处理工具,Linux及Unix环境中现有的功能最强大的数据处理引擎之一。这种编程及数据操作语言(其名称得自于它的创始人阿尔佛雷德·艾侯、彼得·温伯格和布莱恩·柯林汉姓氏的首个字母)的最大功能取决于一个人所拥有的知识。AWK提供了极其强大的功能:可以进行正则表达式的匹配,样式装入、流控制、数学运算符、进程控制语句甚至于内置的变量和函数。它具备了一个完整的语言所应具有的几乎所有精美特性。实际上AWK的确拥有自己的语言:AWK程序设计语言,三位创建者已将它正式定义为“样式扫描和处理语言”。它允许您创建简短的程序,这些程序读取输入文件、为数据排序、处理数据、对输入执行计算以及生成报表,还有无数其他的功能。gawk是AWK的GNU版本。

最简单地说,AWK是一种用于处理文本的编程语言工具。AWK在很多方面类似于Unix shell编程语言,尽管AWK具有完全属于其本身的语法。它的设计思想来源于SNOBOL4、sed、Marc Rochkind设计的有效性语言、语言工具yacc和lex,当然还从C语言中获取了一些优秀的思想。在最初创造AWK时,其目的是用于文本处理,并且这种语言的基础是,只要在输入数据中有模式匹配,就执行一系列指令。该实用工具扫描文件中的每一行,查找与命令行中所给定内容相匹配的模式。如果发现匹配内容,则进行下一个编程步骤。如果找不到匹配内容,则继续处理下一行。

以上是引用wiki对awk的描述。可以看出awk是一项文本处理工具,具有自己的awk的程序语言。由三位设计者:阿尔佛雷德·艾侯、彼得·温伯格、布莱恩·柯林汉共同设计。

AWK是一种处理文本文件的语言。它将文件作为记录序列处理。在一般情况下,文件内容的每行都是一个记录。每行内容都会被分割成一系列的域,因此,我们可以认为一行的第一个词为第一个域,第二个词为第二个,以此类推。AWK程序是由一些处理特定模式的语句块构成的。AWK一次可以读取一个输入行。对每个输入行,AWK解释器会判断它是否符合程序中出现的各个模式,并执行符合的模式所对应的动作。

——阿尔佛雷德·艾侯,The A-Z of Programming Languages: AWK

一.基本语法

awk [options] 'pattern{action}' file

  1. 其中pattern表示AWK在数据中查找的内容,而action是在找到匹配内容时所执行的一系列命令。输入行被分成了一些记录:记录默认由换行符分割,因此输入会按照行进行分割。程序使用给定的条件一个个的测试每条记录,并执行测试通过的条件所对应的action。pattern和action都可以省略不写。无pattern默认匹配全部的记录;而无action则是打印原始记录。简单的AWK表达式之外,pattern可以是BEGIN或END;这两种条件对应的action分别是读取所有的记录之前和之后。同时,如pattern1, pattern2的条件表示符合条件pattern1和pattern2的记录及其之间的部分。

  2. action表示对pattern匹配的内容的处理逻辑

二.命令

awk命令即为前文例子中以action指代的语句。AWK命令可以包括函数调用,变量赋值,计算,及/或各项的组合。标准AWK提供了许多内建函数;其部分实现则可能提供了更多的内建函数。同时,AWK的部分实现支持动态链接库,使得其可以支持更多的函数。

如:
print命令:用于输出文本内容。其输出的文本总是以"输出记录分隔符"(Output record separator, ORS)分割的,其默认值为换行符。

在AWK中,记录会被分割成“域”,它们可以被分别显示或使用:
print $0: 显示当前记录的第1个域
print $1, $3显示当前记录的第1和第3个域,并以预定义的输出域分隔符(Output field separator, OFS)分隔,其默认值为一个空格符

三.内建变量

awk的内建变量包括域变量,例如$1, $2, $3,以及$0。这些变量给出了记录中域的内容。 内建变量也包括一些其他变量:

  • NR:已输入记录的条数。
  • NF:当前记录中域的个数。记录中最后一个域可以以$NF的方式引用。
  • FILENAME:当前输入文件的文件名。
  • FS:“域分隔符”,用于将输入记录分割成域。其默认值为“空白字符”,即空格和制表符。FS可以替换为其它字符,从而改变域分隔符。
  • RS:当前的“记录分隔符”。默认状态下,输入的每行都被作为一个记录,因此默认记录分隔符是换行符。
  • OFS:“输出域分隔符”,即分隔print命令的参数的符号。其默认值为空格。
  • ORS:“输出记录分隔符”,即每个print命令之间的符号。其默认值为换行符。
  • OFMT:“输出数字格式”(Format for numeric output),其默认值为"%.6g"。

参数

awk -F fs -v var=value 'pattern{action}' file

  • -F:用于定义每行内容的域分隔符,默认是空格符,如果fs是空,则每个字符都被分成一个域;

  • -v:在pattern{action}执行前被赋值,常用用于指定变量

echo | awk -v a=100 '{print a}'

样例

1.示例1:

awk '{print}' ods_out_ext_xxx_auth_list_dd_20180803.txt

执行结果:

000181241  000
000184  00
00018232121 23
00018241 33
0001812321

2.示例2:

awk '{print 3+2}' ods_out_ext_xxx_auth_list_dd_20180803.txt

执行结果:

5
5
5
5
5

3.示例3:

awk '{print NR}' ods_out_ext_xxx_auth_list_dd_20180803.txt

执行结果:

1
2
3
4
5

猜你喜欢

转载自www.cnblogs.com/lxyit/p/9417948.html