awk 强大的文本分析工具

作用

AWK 是一种处理文本文件的语言,是一个强大的文本分析工具。

为什么叫 AWK? 这是因为其取了三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的姓氏的首字符。

语法

awk [选项参数] 'script' var=value file(s)
awk [选项参数] -f scriptfile var=value file(s)

参数

  • -F fs 或 --field-separator fs  指定输入文件折分隔符,fs 是一个字符串或者是一个正则表达式,如:-F:。

  • -v var=value 或 --asign var=value  将值赋值给一个用户定义的变量。

  • -f scripfile 或 --file scriptfile  从脚本文件中读取 awk 命令。

  • -mf nnn and -mr nnn  对 nnn 值设置内在限制,-mf 选项限制分配给 nnn 的最大块数目;-mr 选项限制记录的最大数目。这两个功能是 Bell 实验室版 awk 的扩展功能,在标准 awk 中不适用。

  • -W compact 或 --compat, -W traditional 或 --traditional  在兼容模式下运行 awk。所以 gawk 的行为和标准的 awk 完全一样,所有的 awk 扩展都被忽略。

  • -W copyleft 或 --copyleft, -W copyright 或 --copyright  打印简短的版权信息。

  • -W help 或 --help, -W usage 或 --usage  打印全部 awk 选项和每个选项的简短说明。

  • -W lint 或 --lint  打印不能向传统 unix 平台移植的结构的警告。

  • -W lint-old 或 --lint-old  打印关于不能向传统unix平台移植的结构的警告。

  • -W posix  打开兼容模式。但有以下限制,不识别:/x、函数关键字、func、换码序列以及当fs是一个空格时,将新行作为一个域分隔符;操作符**和**=不能代替^和^=;fflush无效。

  • -W re-interval 或 --re-inerval  允许间隔正则表达式的使用,参考(grep中的Posix字符类),如括号表达式[[:alpha:]]。

  • -W source program-text 或 --source program-text  使用 program-text 作为源代码,可与-f命令混用。

  • -W version 或 --version  打印 bug 报告信息的版本。

示例

(1)使用 “awk '{[pattern] action}' {filenames}” 格式解析 log.txt 文件。下面将使用 awk 解析 log.txt,输出文件中的 NAME 列,命令如下:

[hxstrive@localhost ~]$ cat log.txt
NAME     AGE
Tom      20
Helen    30
Bill     27

[hxstrive@localhost ~]$ awk '{print $1}' log.txt
NAME
Tom
Helen
Bill

(2)使用 awk 格式化输出 log.txt 文件中的内容,命令如下:

[hxstrive@localhost ~]$ awk '{printf "%20s %5s\n", $1, $2}' log.txt
                NAME   AGE
                 Tom    20
               Helen    30
                Bill    27

(3)使用 “awk -F” 格式解析 log.txt 文件。其中,-F 相当于内置变量 FS, 用来指定分割字符。下面使用空格作为分隔符来分割字符串,命令如下:

[hxstrive@localhost ~]$ awk -F ' ' '{print $1,$2}' log.txt
NAME AGE
Tom 20
Helen 30
Bill 27

(4)使用 awk 内建 FS 变量指定使用空格作为分隔符,命令如下:

[hxstrive@localhost ~]$ awk 'BEGIN{FS=" "} {print $1,$2}' log.txt
NAME AGE
Tom 20
Helen 30
Bill 27

(5)使用多个分隔符,先使用空格进行分割,然后对分割结果再使用 “,” 进行分割,命令如下:

[hxstrive@localhost ~]$ cat log.txt
NAME,SEX     AGE
Tom,MALE      20
Helen,FEMALE    30
Bill,MALE     27

[hxstrive@localhost ~]$ awk -F '[ ,]' '{printf "%10s | %15s\n",$1,$2}' log.txt
      NAME |             SEX
       Tom |            MALE
     Helen |          FEMALE
      Bill |            MALE

(6)使用 -v 定义一个变量 a,且赋值为 1,然后将 a 变量和年龄相加,命令如下:

[hxstrive@localhost ~]$ cat log.txt
NAME,SEX     AGE
Tom,MALE      20
Helen,FEMALE    30
Bill,MALE     27

[hxstrive@localhost ~]$ awk -va=1 '{print $1,$2,$2+a}' log.txt
NAME,SEX AGE 1
Tom,MALE 20 21
Helen,FEMALE 30 31
Bill,MALE 27 28

(7)使用 -v 定义多个变量,分别为变量 a 和 b,命令如下:

[hxstrive@localhost ~]$ awk -va=1 -vb=' - ' '{print $1,b,$2,b,$2+a}' log.txt
NAME,SEX  -  AGE  -  1
Tom,MALE  -  20  -  21
Helen,FEMALE  -  30  -  31
Bill,MALE  -  27  -  28

(8)使用 “awk -f {awk脚本} {文件名}” 格式执行外部 awk 脚本,例如:

a、cal.awk 脚本内容

[hxstrive@localhost ~]$ cat cal.awk
{print $1,$2}

b、使用 awk 执行 awk  脚本

[hxstrive@localhost ~]$ awk -f cal.awk log.txt
NAME,SEX AGE
Tom,MALE 20
Helen,FEMALE 30
Bill,MALE 27

关于更多的AWK教程,请学习“AWK教程”。

更多关于命令详细参考手册,请使用 man 命令或者 --help 参数获取帮助信息

关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号