工作原理
- 读输入文件之前执行的代码段(由BEGIN关键字标识)。
- 主循环执行输入文件的代码段。
- 读输入文件之后的代码段(由END关键字标识)。
命令结构
1 | awk 'BEGIN{ commands } pattern{ commands } END{ commands }' |
工作流程
开始块(BEGIN)
开始块的语法格式如下:
1 | BEGIN {awk-commands} |
开始块就是在程序启动的时候执行的代码部分,并且它在整个过程中只执行一次。
一般情况下,我们可以在开始块中初始化一些变量。
BEGIN 是 AWK 的关键字,因此它必须是大写的。
注意:开始块部分是可选的,你的程序可以没有开始块部分。
主体块(BODY)
主体部分的语法格式如下:
1 | /pattern/ {awk-commands} |
对于每一个输入的行都会执行一次主体部分的命令。
默认情况下,对于输入的每一行,AWK 都会执行命令。但是,我们可以将其限定在指定的模式中。
注意:在主体块部分没有关键字存在。
结束块(END)
结束块的语法格式如下:
1 | END {awk-commands} |
结束块是在程序结束时执行的代码。 END 也是 AWK 的关键字,它也必须大写。 与开始块相似,结束块也是可选的。
命令形式
1 | awk [-F|-f|-v] ‘BEGIN{} //{command1; command2} END{}’ file |
[-F|-f|-v]
大参数,-F
指定分隔符,-f
调用脚本,-v
定义变量var=value
' '
引用代码块
BEGIN
初始化代码块,在对每一行进行处理之前,初始化代码,主要是引用全局变量,设置FS
分隔符
//
匹配代码块,可以是字符串或正则表达式
{}
命令代码块,包含一条或多条命令
;
多条命令使用分号分隔
END
结尾代码块,在对每一行进行处理之后再执行的代码块,主要是进行最终计算或输出结尾摘要信息
特殊要点:
1 | $0 表示整个当前行 |
测试命令:
1 | awk 'BEGIN{FS=""}{for(i=1;i<=NF;i++) {if (i==NF){print $i}else {printf $i};system("sleep 0.03")}}' /etc/fstab |
awk显示文件中的内容
awk将passwd中的内容以冒号为分隔,并取出第1,3,6位的数据
awk将passwd中的内容以冒号为分隔,并取出第1,3,6位的数据,并用采用tab键作为分隔符
awk以冒号为分隔符,显示一行中有多少字段
awk将每一行最后的一个字段显示出来
awk在每一行前面输出行号
awk显示第几行的数据
统计日志文件中每小时的请求次数
1 | awk -F: '{a[$2]++}END{for(i in a){split(i,t);print i" 至",t[1]":"t[2]+59," 访问 "a[i] " 次" | "sort -t: -k1n -k2n"}}' xxx.xxxx.com_access.log-20190512 |
统计日志文件中每小时指定请求开头的请求次数
1 | grep "2019-05-13T23" xxxx.xxxx.com_access.log-20190512|grep "/pppppp"|wc -l |
查java进程ID
1 | ps -ef|grep java |grep -v java |awk '{print $2}' |
条件语句
IF语句
IF 条件语句语法格式如下:
1 | if (condition) |
也可以使用花括号来执行一组操作:
1 | if (condition) |
以下实例用来判断数字是奇数还是偶数:
1 | awk 'BEGIN {num = 10; if (num % 2 == 0) printf "%d 是偶数\n", num }' |
IF - ELSE 语句
IF - ELSE 条件语句语法格式如下:
1 | if (condition) |
在条件语句 condition 为 true 时只需 action-1,否则执行 action-2。
1 | awk 'BEGIN { |
IF - ELSE - IF
可以创建多个 IF - ELSE 格式的判断语句来实现多个条件的判断:
1 | awk 'BEGIN { |
循环语句
For循环
For 循环的语法如下:
1 | for (initialisation; condition; increment/decrement) |
for 语句首先执行初始化动作( initialisation ),然后再检查条件( condition )。
如果条件为真,则执行动作( action ),然后执行递增( increment )或者递减( decrement )操作。
只要条件为 true 循环就会一直执行。每次循环结束都会进条件检查,若条件为 false 则结束循环。
下面的例子使用 For 循环输出数字 1 至 5:
1 | awk 'BEGIN { for (i = 1; i <= 5; ++i) print i }' |
While循环
While 循环的语法如下:
1 | while (condition) |
While 循环首先检查条件 condition 是否为 true ,若条件为 true 则执行动作 action。此过程一直重复直到条件 condition 为 flase 才停止。
下面是使用 While 循环输出数字 1 到 5 的例子:
1 | awk 'BEGIN {i = 1; while (i < 6) { print i; ++i } }' |
Break 终止循环
在下面的示例子中,当计算的和大于 50 的时候使用 break 结束循环:
1 | awk 'BEGIN { |
Continue 结束本次循环进入下次循环
Continue 语句用于在循环体内部结束本次循环,从而直接进入下一次循环迭代。
下面的例子输出 1 到 20 之间的偶数:
1 | awk 'BEGIN {for (i = 1; i <= 20; ++i) {if (i % 2 == 0) print i ; else continue} }' |
Exit 结束程序
该函数接受一个整数作为参数表示 AWK 进程结束状态。 如果没有提供该参数,其默认状态为 0。
下面例子中当和大于 50 时结束 AWK 程序。
1 | awk 'BEGIN { |