一、Awk 基础语法:
Awk –Fs ‘/pattern/ {action}’ input-file
(或者)
Awk –Fs ‘{action}’ input-file
上面语法中:
-F 为字段分界符。如果不指定,默认会使用空格作为分界符。
/pattern/和{action}需要用单引号引起来。
/pattern/是可选的。如果不指定,awk 将处理输入文件中的所有记录。如果指定一个模式,awk 则只处理匹配指定的模式的记录。
{action} 为 awk 命令,可以是单个命令,也可以多个命令。整个 action(包括里面的所有命令)都必须放在{ 和 }之间。
Input-file 即为要处理的文件
典型的 awk 程序包含下面三个区域:
- BEGIN 区域
Begin 区域的语法:
BEGIN { awk-commands }
BEGIN 区域的命令只最开始、在 awk 执行 body 区域命令之前执行一次。
BEGIN 区域很适合用来打印报文头部信息,以及用来初始化变量。
BEGIN 区域可以有一个或多个 awk 命令
关键字 BEGIN 必须要用大写
BEGIN 区域是可选的 - body 区域
body 区域的语法:
/pattern/ {action}
body 区域的命令每次从输入文件读取一行就会执行一次
如果输入文件有 10 行,那 body 区域的命令就会执行 10 次(每行执行一次)
Body 区域没有用任何关键字表示,只有用正则模式和命令。 - END block
END 区域的语法:
END { awk-commands }
END 区域在 awk 执行完所有操作后执行,并且只执行一次。
END 区域很适合打印报文结尾信息,以及做一些清理动作
END 区域可以有一个或多个 awk 命令
关键字 END 必须要用大写
END 区域是可选的**
例
多个输入文件时如果指定了两个文件,那么 body 区域会首先在第一个文件的所有行上执行,然后在第二个文件的所有行上执行。
例:显示文件内容,给每一列添加标题
vi student
二、常用命令
1.-v 变量赋值选项
该选项将一个值赋予一个变量,它会在程序开始之前进行赋值
三、内置变量
1.打印命令
默认情况下,awk 的打印命令 print(不带任何参数)会打印整行数据。与$0有相同作用 ($0代表整条记录)
awk -F: ‘{print}’ /etc/passwd
awk -F:’{print $0}’ /etc/passwd
打印所有的行
这两者结果相同
2.FS输入字段分隔符
-F: 与 FS=":’ 有相同作用
awk ‘BEGIN{FS=":"} {print $2,$3}’ /etc/passwd
- NR – 记录序号
NR 非常有用,在循环内部标识记录序号。用于 END 区域时,代表输入文件的总记录数。
awk ‘END{ print NR }’ filename
#统计文件中的行数:只用了END语句块,在读入每一行的时,awk会将NR更新为对应的行号,当到达最后一行NR的值就是最后一行的行号,所以END语句块中的NR就是文件的行数
4 .NF 表示字段数,在执行过程中对应于当前的字段数。
例:查看/etc/passwd中当前字段数
awk ‘{ print $NF }’ /etc/passwd#打印出一行中的最后一个字段;
awk ‘{ print $(NF-1)}’ /etc/passwd#打印出一行中的最后第二个字段;
5.外部变量参数传递
6.awk运算与判断
1)算术运算符
2)自增自减运算符
3)关系运算符
4)赋值运算符
7.正则运算符
#~ ~! 匹配正则表达式和不匹配正则表达式
awk ‘BEGIN {a=“100testa”; if(a ~ /^100*/) {print “ok”;}}’
8.比较运算符
9.#a>b?y:n 三目运算条件表达式
awk ‘BEGIN{a=“b”;print a==“b”?“ok”:“err”;}’
10.in 数组中是否存在某键值
awk ‘BEGIN{a=“b”;arr[0]=“b”;arr[1]=“c”;print (a in arr);}’
awk ‘BEGIN{a=“b”;arr[0]=“b”;arr[“b”]=“c”;print (a in arr);}’
11.高级输入输出
cat filename
aa 100
bb 353
cc 234
total 1000
awk ‘{if($1==“total”){next};print }’ filename #awk中next语句,相当于其他编程语言的continue
12.简单读取记录
awk ‘BEGIN{ “date” | getline out; print out }’ test
awk ‘BEGIN{ “date” | getline out; split(out,mon); print mon[2] }’ test
13.输出到一个文件 输出重定向
datefile文件中为空
echo | awk ‘{printf(“hello word!”) > “datafile”}’
echo | awk ‘{printf(“hello word!”) >> “datafile”}’