Linux-awk用法

工作原理

  1. 读输入文件之前执行的代码段(由BEGIN关键字标识)。
  2. 主循环执行输入文件的代码段。
  3. 读输入文件之后的代码段(由END关键字标识)。

命令结构

1
awk 'BEGIN{ commands } pattern{ commands } END{ commands }'

工作流程

awk工作流程

1、通过关键字 BEGIN 执行 BEGIN 块的内容,即 BEGIN 后花括号 {} 的内容。
2、完成 BEGIN 块的执行,开始执行body块。
3、读入有 \n 换行符分割的记录。
4、将记录按指定的域分隔符划分域,填充域,$0 则表示所有域(即一行内容),$1 表示第一个域,$n 表示第 n 个域。
5、依次执行各 BODY 块,pattern 部分匹配该行内容成功后,才会执行 awk-commands 的内容。
6、循环读取并执行各行直到文件结束,完成body块执行。
7、开始 END 块执行,END 块可以输出最终结果。

开始块(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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
$0 表示整个当前行

$1 每行第一个字段

NF 字段数量变量

NR 每行的记录号,多文件记录递增

FNR 与NR类似,不过多文件记录不递增,每个文件都从1开始

\t 制表符

\n 换行符

FS BEGIN时定义分隔符

RS 输入的记录分隔符, 默认为换行符(即文本是按一行一行输入)

~ 匹配,与==相比不是精确比较

!~ 不匹配,不精确比较

== 等于,必须全部相等,精确比较

!= 不等于,精确比较

&& 逻辑与

|| 逻辑或

+ 匹配时表示1个或1个以上

/[0-9][0-9]+/ 两个或两个以上数字

/[0-9][0-9]*/ 一个或一个以上数字

FILENAME 文件名

OFS 输出字段分隔符, 默认也是空格,可以改为制表符等

ORS 输出的记录分隔符,默认为换行符,即处理结果也是一行一行输出到屏幕

-F'[:#/]' 定义三个分隔符

测试命令:

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中的内容,并且设置只显示前面5条信息。

awk显示文件内容

awk将passwd中的内容以冒号为分隔,并取出第1,3,6位的数据

awk分隔内容

awk将passwd中的内容以冒号为分隔,并取出第1,3,6位的数据,并用采用tab键作为分隔符

awk分隔内容2

awk以冒号为分隔符,显示一行中有多少字段

awk统计一行内容

awk将每一行最后的一个字段显示出来

awk显示每行最后一个字段

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
2
if (condition)
action

也可以使用花括号来执行一组操作:

1
2
3
4
5
6
7
8
if (condition)
{
action-1
action-1
.
.
action-n
}

以下实例用来判断数字是奇数还是偶数:

1
awk 'BEGIN {num = 10; if (num % 2 == 0) printf "%d 是偶数\n", num }'

判断奇数还是偶数

IF - ELSE 语句

IF - ELSE 条件语句语法格式如下:

1
2
3
4
if (condition)
action-1
else
action-2

在条件语句 condition 为 true 时只需 action-1,否则执行 action-2。

1
2
3
4
5
awk 'BEGIN {
num = 11;
if (num % 2 == 0) printf "%d 是偶数\n", num;
else printf "%d 是奇数\n", num
}'

判断奇数还是偶数

IF - ELSE - IF

可以创建多个 IF - ELSE 格式的判断语句来实现多个条件的判断:

1
2
3
4
5
6
7
8
9
awk 'BEGIN {
a=30;
if (a==10)
print "a = 10";
else if (a == 20)
print "a = 20";
else if (a == 30)
print "a = 30";
}'

IF - ELSE - IF示例

循环语句

For循环

For 循环的语法如下:

1
2
for (initialisation; condition; increment/decrement)
action

for 语句首先执行初始化动作( initialisation ),然后再检查条件( condition )。

如果条件为真,则执行动作( action ),然后执行递增( increment )或者递减( decrement )操作。

只要条件为 true 循环就会一直执行。每次循环结束都会进条件检查,若条件为 false 则结束循环。

下面的例子使用 For 循环输出数字 1 至 5:

1
awk 'BEGIN { for (i = 1; i <= 5; ++i) print i }'

For循环输出1至5

While循环

While 循环的语法如下:

1
2
while (condition)
action

While 循环首先检查条件 condition 是否为 true ,若条件为 true 则执行动作 action。此过程一直重复直到条件 condition 为 flase 才停止。

下面是使用 While 循环输出数字 1 到 5 的例子:

1
awk 'BEGIN {i = 1; while (i < 6) { print i; ++i } }'

While循环输出1至5

Break 终止循环

在下面的示例子中,当计算的和大于 50 的时候使用 break 结束循环:

1
2
3
4
5
awk 'BEGIN {
sum = 0; for (i = 0; i < 20; ++i) {
sum += i; if (sum > 50) break; else print "Sum =", sum
}
}'

Break终止循环

Continue 结束本次循环进入下次循环

Continue 语句用于在循环体内部结束本次循环,从而直接进入下一次循环迭代。

下面的例子输出 1 到 20 之间的偶数:

1
awk 'BEGIN {for (i = 1; i <= 20; ++i) {if (i % 2 == 0) print i ; else continue} }'

Continue 结束本次循环进入下次循环

Exit 结束程序

该函数接受一个整数作为参数表示 AWK 进程结束状态。 如果没有提供该参数,其默认状态为 0。

下面例子中当和大于 50 时结束 AWK 程序。

1
2
3
4
5
awk 'BEGIN {
sum = 0; for (i = 0; i < 20; ++i) {
sum += i; if (sum > 50) exit(10); else print "Sum =", sum
}
}'

Exit结束程序

本文标题:Linux-awk用法

文章作者:王洪博

发布时间:2018年09月17日 - 10:09

最后更新:2019年09月18日 - 10:09

原始链接:http://whb1990.github.io/posts/ed2e0218.html

▄︻┻═┳一如果你喜欢这篇文章,请点击下方"打赏"按钮请我喝杯 ☕
0%