Awk 是一个维护和处理文本数据文件的强大语言。在文本数据有一定的格式,即每行数据包 含多个以分界符分隔的字段时,显得尤其有用。 即便是输入文件没有一定的格式,你仍然可 以使用 awk 进行基本的处理。 Awk 当然也可以没有输入文件,那不是必须的。 简言之, AWK 是一种能处理从琐碎的小事到日常例行公事的强大语言。
二、awk语法1.基础语法:
awk [-F field-separator] '/pattern/ {action}' input-file (或者) awk [-F field-separator] '{action}' input-file上面语法中:
-F 为字段分界符。如果不指定,默认会使用空格作为分界符。
/pattern/和{action}需要用单引号引起来。
/pattern/是可选的。如果不指定, awk 将处理输入文件中的所有记录。如果指定一个模式, awk 则只处理匹配指定的模式的记录。
{action} 为 awk 命令,可以是单个命令,也可以多个命令。整个 action(包括里面的所有命令)都必须放在{ 和 }之间。
Input-file 即为要处理的文件
实例1:打印/etc/passwd文件中mail用户所在行的用户名mail
[root@localhost ~]# grep '^mail' /etc/passwd mail:x:8:12:mail:/var/spool/mail:/sbin/nologin [root@localhost ~]# awk -F: '/mail/{print $1}' /etc/passwd #-F ":"也是正确的 mail2.awk脚本:
当需要执行很多 awk 命令时, 可以把/pattern/{action}这一部分放到单独的文件中,然后调 用它:
awk –Fs –f myscript.awk input-file #[-F field-separator]简写 -FS也可以在这个文件中设置字段分界符(后面详述),然后调用:
awk –f myscript.awk input-file 二、Awk 程序结构(BEGIN,body,END)区域1.BEGIN 区域
Begin 区域的语法:
BEGIN { awk-commands }说明:BEGIN 区域的命令只最开始、在 awk 执行 body 区域命令之前执行一次。
BEGIN 区域很适合用来打印报文头部信息,以及用来初始化变量。
BEGIN 区域可以有一个或多个 awk 命令
关键字 BEGIN 必须要用大写
BEGIN 区域是可选的
2.body 区域
body 区域的语法:
/pattern/ {action}
body 区域的命令每次从输入文件读取一行就会执行一次
如果输入文件有 10 行,那 body 区域的命令就会执行 10 次(每行执行一次)
Body 区域没有用任何关键字表示,只有用正则模式和命令。
3.END block
END 区域的语法:
END { awk-commands }
END 区域在 awk 执行完所有操作后执行,并且只执行一次。
END 区域很适合打印报文结尾信息,以及做一些清理动作
END 区域可以有一个或多个 awk 命令
关键字 END 必须要用大写
END 区域是可选的
awk执行流程图:
实例1:
[root@localhost ~]# awk ' > BEGIN{FS=":";print "----header----"} #打印内容字符串要用双引号,单引号有语法错误 > /mail/{print $1} > END{print "----footer----"} > ' /etc/passwd ----header---- mail ----footer----提示:如果命令很长,即可以放到单行执行,也可以用\折成多行执行。
实例2:通过awk脚本执行实例1中的命令
[root@localhost ~]# cat myscript.awk BEGIN{ FS=":" print "----header----" } /mail/{ print $1 } END{ print "----footer----" } [root@localhost ~]# awk -f myscript.awk /etc/passwd ----header---- mail ----footer----说明:awk 脚本中,注释以#开头。
只使用 BEGIN 区域在 awk 中是符合语法的。在没有使用 body 区域时,不需要指定输入文件, 因为 body 区域只在输入文件上执行。 所以在执行和输入文件无关的工作时,可以只使用 BEGIN 区域。
实例3:只使用BEGIN无输入文件
[root@localhost ~]# awk 'BEGIN{print "HELLO WORLD"}' HELLO WORLD4.多个输入文件:
awk 指定多个输入文件。如果指定了两个文件,那么 body 区域会首先在第一 个文件的所有行上执行,然后在第二个文件的所有行上执行。
实例4:多文件处理
[root@localhost ~]# awk -F: ' > BEGIN{print "----header----"} > /mail/{print $1} > END{print "----footer----"} > ' /etc/passwd /etc/group ----header---- mail mail ----footer----注意:即是指定了多个文件, BEGIN 和 END 区域,仍然只会执行一次。
三、打印命令默认情况下,awk 的打印命令 print(不带任何参数)会打印整行数据。下面的例子等价于”cat employee.txt”命令。