AWK主要用于文本数据处理,由Afred, Weinberger和Kernighan设计,故名AWK。
AWK的初始版本由AT&T实验室开发,此外,NAWK
是AWK的改进版本,而应用最广泛的当属GAWK
,即GNU AWK
,为Linux内置的默认版本,对AWK和NAWK可以完全兼容。
Awk
的程序结构包括三个区块:
BEGIN {awk-commands}
/pattern/ {awk-commands}
END {awk-commands}
其中awk-commands
表示awk
指令;/pattern/
表示指定的处理模式。
以文本文件test.txt
为例,下面为其内容
1) Amit Physics 80
2) Rahul Maths 90
3) Shyam Biology 87
通过awk
可以逐行打印出这个文本文件,并可以添加表头,方法如下
$ awk 'BEGIN{printf "No\tName\tSub\tMarks\n"}{print}' test.txt
No Name Sub Marks
1) Amit Physics 80
2) Rahul Maths 90
3) Shyam Biology 87
其基本方法为,可用awk
直接调用后面的字符串中所写的脚本命令。其中BEGIN
标识的大括号为开始块,用于打印表头;后面的{print}
为主体块,表示按行打印test.txt
中的内容。
通过$
选列,可实现单行输出,例如只想输出人名,则
awk 'BEGIN{printf "Name\n"}{print $2}' test.txt
Name
Amit
Rahul
Shyam
其中$2
表示第二列。
通过awk -f
命令,可以执行脚本,例如可将同样的功能封装入脚本test.awk
中,
# test.awk文件
BEGIN{
printf "Name\n"
}
{
print $2
}
然后在命令行中调用,其效果与刚刚相同
$ awk -f test.awk test.txt
Name
Amit
Rahul
Shyam
除了可以将处理结果打印在命令行中,awk
也可以将其输出到文本文件,其方法为
print DATA > oFile
print DATA >> oFile
可将DATA
输出到oFile
中,如果oFile
不存在,则先创建该文件。>
为写入模式,若oFile
存在,数据输出前会将oFile
中原有的数据删除;>>
为追加模式,数据将在oFile
结尾写入。
下例将test.txt
打开,并重新存储到new.txt
中
awk '{ print $0 > "./new.txt" }' test.txt
当然也可以交换两列的位置
$ awk '{print $4,$3,$2,$1 > "./new.txt"}' test.txt
$ cat new.txt
80 Physics Amit 1)
90 Maths Rahul 2)
87 Biology Shyam 3)
AWK
可通过管道将一个程序的输出传递给另一个程序,其使用方法为
print items | command
例如下例将hello, world"
传递给tr
。
$ awk 'BEGIN { print "hello, world" | "tr [a-z] [A-Z]" }'
HELLO, WORLD !!!
通过|&
可使用双工管道,进行双向通信
# 文件pipe.awk
BEGIN {
cmd = "tr [a-z] [A-Z]" # 建立双向通信惯导
print "hello, world !!!" |& cmd # 为tr提供输入
close(cmd, "to") # 执行后关闭to进程
cmd |& getline out # 将输出存储到out中
print out; # 打印out
close(cmd); # 关闭cmd
}
执行脚本后可得到
HELLO, WORLD !!!