命令简介

AWK 是一种强大的文本处理工具,主要用于对文本文件进行模式匹配和数据处理。它是一种解释型的编程语言,具有高度的可移植性和易学性。AWK 由三个人的名字首字母组成,分别是 Alfred Aho、Peter Weinberger 和 Brian Kernighan。

命令语法

AWK 命令的基本语法格式为: awk [options] ‘script’ file(s)

  • options: 用于指定 AWK 命令的选项,例如 -F 指定字段分隔符。
  • script: 用于指定 AWK 命令的程序代码。
  • file(s): 需要处理的一个或多个文件。

参数说明

AWK 命令提供了多个可选参数,下表列出了常用的参数及其说明:

参数 说明 备注
-F 指定字段分隔符,默认为空格 -
-v 在程序中定义变量及其值 -
-f 从指定的文件中获取 AWK 程序代码 -
-m 设置内部字段分隔符 -
-W 设置 AWK 的兼容模式 -
NF 表示当前记录(行)中字段的数量 内置参数
NR 表示当前记录(行)的行号 内置参数
FS 指定字段分隔符,默认为空格。相当于使用 -F 内置参数
OFS 表示输出字段分隔符,默认与 FS 相同 内置参数

命令实例

下面给出一些 AWK 命令的实例,以帮助更好地理解其用法:

1.从文件中读取 AWK 脚本

1
awk -f script.awk input_file

3.设置变量的值

1
awk -v var=value '{print var}' input_file

基本打印输出

1.打印文件的每一行

1
awk '{print}' file.txt

2.打印文件的第二列

1
awk '{print $2}' file.txt

3.打印指定字段

1
awk '{print $2, $1}' input_file

4.使用自定义分隔符

1
awk -F':' '{print $1}' input_file

模式匹配

1.打印包含特定模式的行

1
awk '/pattern/' file.txt

统计和计算

1.统计文件的行数

1
awk 'END {print NR}' file.txt

2.计算文件每行字符数的总和

1
awk '{sum += length($0)} END {print sum}' input_file

3.计算文件中数值字段的平均值

1
awk '{sum += $1} END {print "Average: ", sum/NR}' input_file

4.计算整个文件的字段总和

1
awk '{sum+=$2} END {print sum}' file.txt

5.输出指定字段的最大值和最小值

1
awk 'BEGIN {max = 0; min = 999999} {if ($1 > max) max = $1; if ($1 < min) min = $1} END {print "Max: ", max, "Min: ", min}' input_file

文本替换

1.用特定字符替换字段

1
awk '{sub(/foo/,"bar",$1); print}' file.txt

格式化输出

1.格式化打印输出

1
awk 'BEGIN {printf "%-10s %-10s\n","Name","Age"} {printf "%-10s %-10d\n",$1,$2}' file.txt

内置变量

假设有一个名为 data.txt 的文件内容如下:

1
2
3
4
Alice 25
Bob 30
Charlie 28
David 35

1.使用 NF 打印没一行中字段的数量

1
awk '{print NF}' data.txt

输出结果:

1
2
3
4
2
2
2
2

2.使用 NR 获取行号

1
awk '{print NR, $0}' data.txt

输出结果:

1
2
3
4
1 Alice 25
2 Bob 30
3 Charlie 28
4 David 35

3.使用 FS 指定分割符号,默认为任意空白字符(空格或制表符)。如果数据文件中的字段使用逗号作为分隔符,我们可以使用 -F 参数来指定分隔符:

1
awk 'BEGIN {FS=" "} {print $2}' test_data.txt

或者:

1
awk -F ' ' '{print $2}' test_data.txt

又或者简写成:

1
awk '{print $2}' test_data.txt

输出结果:

1
2
3
4
25
30
28
35

4.使用 OFS 设置分割符:

1
awk 'BEGIN {OFS=","} {print $1, $2}' data.txt

输出结果:

1
2
3
4
Alice,25
Bob,30
Charlie,28
David,35

控制语句

1.使用 if-else 语句

1
awk '{if ($2 > 50) {print $1, "老年人"} else {print $1, "年轻人"}}' file.txt

或者:

1
awk '$3 > 50 {print $1, $2}' input_file

2.使用 for 循环遍历每个字段

1
awk '{for (i=1; i<=NF; i++) {print $i}}' file.txt

这些只是 AWK 命令的基本用法,它还有许多高级功能,如数组、函数、控制语句等,可以完成更加复杂的文本处理任务。通过实践和学习,你可以逐步掌握 AWK 的强大功能。