awk是一个维护和处理文本数据文件的强大语言。在处理有一定格式的数据时,即每行数据包含多个以分界符分隔的字段时,尤其有用。awk也可以没有输入文件,那不是必须的。
1.awk命令语法
awk -Fs '/pattern/{action}' input-file
或
awk -Fs '{action}' input-file
- F为指定字段分界符。如果不指定,默认空格作为分界符。
/pattern/和{action}需要用单引号引起来。
/pattern/是可选的。如何不指定,awk将处理输入文件中的所有记录。
{action}为awk命令,可以是单个命令,也可以多个命令。
input-file即为要处理的文件。
1.1 .把awk命令放入单独的文件中(awk脚本)
当需要执行很多awk命令时,可以把/pattern/{action}这一部分放到单独的文件中,然后调用它:
awk -Fs -f myscript.awk input-file
myscript.awk可以使用任意扩展名(也可以不用)。但是加上扩展名.awk更加直观和便于维护,也可以在这个文件中设置字段分界符,然后调用:
awk -f myscript.awk input-file
2.awk程序结构(BEGIN,body,END)区域
1.BEGIN区域
语法:BEGIN {awk-commands}
BEGIN区域的命令只最开始在awk执行body区域命令之前执行一次。
BEGIN 区域适合用来打印报文头部信息,以及初始化变量。
BEGIN区域可以有一个或多个awk命令
必须要大写
BEGIN区域是可选的
2.body区域
语法:/pattern/{action}
body区域命令每次从输入文件读取一行就会执行一次
如果输入文件有10行,那body区域的命令就会执行10次(每行执行一次)
body区域没有用任何关键字表示,只有用正则模式和命令
3.END区域
语法:END {awk-commands}
END区域在awk执行完所有操作后执行,并且只执行一次
END区域适合打印报文结尾信息,以及做一些清理动作
END区域可以有一个或多个awk命令
关键字END必须要用大写
END区域可选
实例:
# vim mytest.awk
# cat mytest.awk
BEGIN{
FS=":"
print "---header---"
}
/mail/{
print $1
}
END{
print"---footer---"
}
# awk -f mytest.awk /etc/passwd
---header---
mail
---footer---
只有body区域:
# awk -F: '{print $1}' /etc/passwd
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
operator
games
ftp
nobody
systemd-network
只有BEGIN区域:
# awk 'BEGIN{print "hello world!"}'
hello world!
只包含BEGIN和body区域:
# awk -F: 'BEGIN{print "UID"}{print $3}' /etc/passwd
UID
0
1
2
3
4
5
6
7
8
输入多个文件:
awk可以指定多个输入文件,如果指定了两个文件,body区域会首先在第一个文件的所有行上执行,然后在第二个文件的所有行上执行。
# awk 'BEGIN{FS=":";print"---header---"}\
> /mail/{print $1}\
>
> END{print"---footer---"}' /etc/passwd /etc/group
3.打印命令
awk的打印命令print(不带参)会打印整行数据。
# awk '{print}' employee.txt
101,John Doe,CEO
102,Jason Smith,IT Manager
103,Raj Reddy,Sysadmin
104,Anand Ram,Developer
105,Jane Miller,Sales Manager
# awk '{print $2}' employee.txt
Doe,CEO
Smith,IT
Reddy,Sysadmin
Ram,Developer
Miller,Sales
可见默认分隔符为空格
4.模式匹配
打印管理者的姓名和职位:
# awk -F',' '/Manager/{print $2,$3}' employee.txt
Jason Smith IT Manager
Jane Miller Sales Manager
只打印雇员id为102的信息:
# awk -F',' '/^102/{print "Emp id 102 is",$2}' employee.txt
Emp id 102 is Jason Smith