今天我们来看看 AWK,那么 AWK 是什么呢?AWK 是一个优良的文本处理工具,Linux 及 Unix 环境中现有的功能最强大的数据处理引擎之一。它的分类有 NAWK GAWK AWK。AWK 经过改进生成的新的版本 GAWK,NAWK,现在默认linux系统下日常使用的是 GAWK。

下来我们来看看 AWK 的执行流程,如下图所示

我们看到它也是行处理模式,每读取一行便读取到剥离体中。下来我们来看看 awk 命令的格式:awk -Fs 'BEGIN{ } /pattern/ {action} END{ }' input-file ;-F 是指定分隔符。

我们看到以 , 结尾的,打印出三个段。

下面我们来看看 awk 中的内置变量:

a> awk 分隔符 FS:

awk 'BEGIN { FS=","; \
print "-------------\nName\tTitle\n-------------" } \
{ print $2,"\t",$3; } \
END {print "-------------"}' employee.txt

我们以 \t 的格式打印出 Name 和 Title。

b> 指定多个分隔符,格式:awk 'BEGIN {FS="[,:%]"} {action}' input-file

我们看到我们以第 2 段和第 3 段的格式输出信息。

c> 输出分隔符 OFS,格式:awk -F ',' '{print $2, ":", $3}' employee.txt 等同于 awk -F ',' 'BEGIN { OFS=":" } { print $2, $3 }' employee.txt

d> 指定分隔符并换行 RS,指定分割字符,将一行分成多行。

输入示例如下

e> 输出分隔符 ORS

下来我们来看看AWK 中的 print 和 printf,那么它们有何区别呢?在 print 中不需要加引号,字符串需要加引号。示例:date | awk '{print Month: " $2 "\nYear:",$1} ' ;printf 与 C 语言基本一致,转移字符:- %c 字符、- %s 字符串、- %d 十进制整数、- %f 浮点型

我们看到 print 和 printf 的区别,仅仅只是需要加引号的区别,printf 和 C 语言中的打印方式是一样的。我们来看看一个 awk 中的内置变量 OFMT,它的作用是干什么嘞?它是控制输出的,示例:date | awk '{OFMT="%.2f"; print 1.3456, 3.45}'

我们接下来看看几个实例应用:

1、将以下字符串以:分隔,分成多行

101,John Doe:102,Jason Smith:103,Raj Reddy:104,Anand Ram:105,Jane Miller


2、windows 与 Linux 文件格式转换

命令:awk 'BEGIN{RS="\n";ORS="\r\n"} {print $0}' README.txt > README.WIN


我们看到在 Windows 下打开 README.txt 格式是不对的,都在一行。但是经过 awk 命令的转换后,它就符合了 Windows 下的文本格式,将 Linux 下的换行符 \r\n 转换成 Windows 下的 \n 换行符的格式。下来我们再来看看 awk 中的内置变量,掌握更多的内置变量将有利于我们更高效的进行开发。还是将以下内容放入我们的 employee.tx 文本中

101,JohnDoe,CEO102,JasonSmith,ITManager103,RajReddy,Sysadmin104,AnandRam,Developer105,JaneMiller,SalesManager

我们来看看一个内置变量 NR,它的作用是记录处理的行号。示例:awk '/Jason/ { print NR, $0}' employee.txt

那么我们多复制几个文本呢,看看结果是怎样的

我们看到记录到的行号是 2 7 12,那么这是为什么呢?NR 变量不会重置计数器,这便是我们要强调的一个注意事项。

FILENAME 内置变量,它的作用是同时处理多个文件时,用来标志当前处理的文件名 。注意:1) 处理文本时显示文件;2) 从管道输入流接收内容时显示 "-"


我们看到在输出时加字符串必要要用双引号括起来,同时我们也可用 NR 来进行行号的输出。在管道后接收内容时会显示 "-"。

接下来我们来看看 FNR 内置变量,它跟NR 内置变量类似,但会重置计数器。

我们看到三个打印的都是第 2 行。