awk运行方式有三种,其中常用的为命令行方式
awk [-F field_separator] '{pattern + action}' input_file(s)
其中,其中 pattern 表示awk需要查找的内容,由符号//包围,形如 /^shouke/,而 action 是在找到匹配内容时所执行的一系列命令,[-F field_separator]可选,input-file(s) 是待处理的文件。
通常,awk是以文件的一行为处理单位的。awk每接收文件的一行,然后执行相应的命令来处理文本。
在awk中,文件的每一行中,由域分隔符(field_separator,默认为空格)分开的每一项称为一个域。
[root@localhost ~]# touch testfile
[root@localhost ~]# vim testfile
id name sex addr hobby
1 name:shouke sex:男 addr:深圳 hobby:music
2 name:laiyu sex:女 addr:云南 hobby:none
例子1:不指定分割符,从文件读取数据(awk '{action}' input_file(s)
[root@localhost ~]# awk '{print $1, $2}' testfile
id name
1 name:shouke
2 name:laiyu
说明:awk工作流程是这样的:读入由换行符'\n'分割的一条记录,然后将记录按指定的域分隔符划分域,填充域($0则表示所有域,$1表示第一个域,$n表示第n个域),接着读取下一条记录,重复前面的操作。默认域分隔符是"空白键" 或 "tab键"
例子2:指定分隔符,从文件读取数据(awk -F field_separator '{action}' input_file(s)
[root@localhost ~]# awk -F ':' '{print $1, $2}' testfile
id name sex addr hobby
1 name shouke sex
2 name laiyu sex
例子3:从命令输出结果读取数据
[root@localhost ~]# cat testfile | awk '{print $2, $3}'
name sex
name:shouke sex:男
name:laiyu sex:女
例子4:格式化输出
[root@localhost ~]# cat testfile | awk '{print $2"\t"$3}'
name sex
name:shouke sex:男
name:laiyu sex:女
例子5: 指定初始操作和结尾操作
[root@localhost ~]# cat testfile | awk 'BEGIN {print "first"} {print $2,$3} END {print "finally"}'
first
name sex
name:shouke sex:男
name:laiyu sex:女
finally
例子6:指定pattern模式(awk [-F field_separator] '{pattern}' input_file(s)
[root@localhost ~]# cat testfile | awk '/laiyu/'
2 name:laiyu sex:女 addr:云南 hobby:none
说明:
1.例子为搜索文件中所有包含pattern即字符串“laiyu”的行记录,仅匹配了pattern(例中为laiyu)的行才会执行action(这里没有指定action,默认输出每行的内容)。
2.搜索支持正则,例如找laiyu开头的: cat testfile | awk '/^laiyu/'
例7:指定pattern+action模式(awk [-F field_separator] '{pattern+action}' input_file(s) [root@localhost ~]# cat testfile | awk '/laiyu/{print $2, $3}'
name:laiyu sex:女
例8:printf格式化输出
[root@localhost home]# cat testfile | awk '{print $2}' | awk -F ':' '{printf("newname:%5s, oldname:%5s\n", $2, $2)}'
newname: , oldname:
newname:shouke, oldname:shouke
newname:laiyu, oldname:laiyu
newname: , oldname:
例9:自定义变量
[root@localhost home]# cat testfile | awk 'BEGIN {num=0;}{num=num+1;} END{print "rows of record have been read is: " num}'
rows of record have been read is: 4
说明:例中自定义了一个变量:num,初始值为0。action{}中可以有多条语句,每条以;号隔开。
例10:使用内置变量
[root@localhost home]# cat testfile | awk '{print "rows of record have been read is: " NR}'
rows of record have been read is: 1
rows of record have been read is: 2
rows of record have been read is: 3
rows of record have been read is: 4
说明:处理$0等变量,awk还有其它内置变量,比如 NR--读取的记录数,FILENAME--awk浏览的文件名
除此之外,action {}中还可使用循环语句,判断语句等