如何调用脚本

一. 使用 -f 选项运行脚本

将 awk 命令写入一个文本文件(例如 my.awk),然后用 -f 调用:

1
awk -f my.awk 输入文件1 [输入文件2 ...]

示例脚本 my.awk:

1
2
3
BEGIN { print "开始处理" }
{ print "行号:" NR, "内容:" $0 }
END { print "处理完成" }

运行:

1
awk -f my.awk data.txt

二. 让 awk 脚本直接可执行(shebang)

在脚本文件的第一行添加 #!/usr/bin/awk -f,然后赋予执行权限。

示例脚本 count.awk:

1
2
3
4
5
6
#!/usr/bin/awk -f

# 统计非空行数量
BEGIN { count = 0 }
NF > 0 { count++ }
END { print "非空行数:", count }

赋予权限并运行:

1
2
chmod +x count.awk
./count.awk data.txt

注意:shebang 中 awk 的路径是 /usr/bin/awk,也可用 #!/usr/bin/env awk -f 以增强可移植性。

三. 在脚本中处理多个文件

1
awk -f script.awk file1.txt file2.txt

四. 向脚本传递变量

使用 -v 选项可以在脚本执行前定义变量:

1
awk -f script.awk -v threshold=100 data.txt

脚本内可直接使用 threshold。

五. 结合其他选项

  • 指定字段分隔符:awk -F, -f script.awk data.csv

  • 使用多个脚本文件:可以多次使用 -f,如 awk -f common.awk -f main.awk data.txt

六.调试与注意事项

  • 语法检查:可用 awk -f script.awk –source ‘BEGIN{exit}’ 简单检查,或使用 gawk –lint -f script.awk。

  • 脚本中的注释:以 # 开头,直到行末。

  • 换行与分号:语句之间可用分号分隔,也可换行。

  • 函数定义:支持自定义函数,放在脚本中适当位置。

awk脚本的结构和语法

一.脚本的基本结构

1
2
3
4
BEGIN { 初始化操作 }            # 在处理任何输入行之前执行
/正则/ { 匹配时执行的动作 } # 匹配正则的行
条件表达式 { 动作 } # 条件为真时执行
END { 汇总操作 } # 所有输入行处理完后执行

示例:

1
2
3
BEGIN { FS=":"; print "开始处理" }
$3 >= 1000 { print $1, $3 }
END { print "处理完成" }

二.变量与内置变量

内置变量(部分)

变量 含义
$0 当前整行
$n 第n个字段
NF 当前行字段数
NR 当前行号(所有文件累计)
FNR 当前文件内行号
FS 输入字段分隔符(默认空格或制表符)
OFS 输出字段分隔符(默认空格)
RS 输入记录分隔符(默认换行)
ORS 输出记录分隔符(默认换行)
ARGC, ARGV 命令行参数数组
FILENAME 当前输入文件名

三.用户自定义变量

变量名由字母、数字、下划线组成,区分大小写,无需显式声明,默认值为空字符串或0。

1
2
3
BEGIN { count = 0 }
{ count++ }
END { print "总行数:", count }

运算符

  • 算术:+、 -、 *、 /、 %、 ^(^ 为乘方)

  • 字符串连接:空格, “a” “b” 得 “ab”

  • 赋值:=、 +=、 -=、 *=、 /=、 %=、 ^=

  • 比较:==、 !=、 >、 <、 >=、 <=(字符串比较按字典序)

  • 逻辑:&&、||、!

  • 三元:条件 ? 表达式1 : 表达式2

四.控制语句

if-else

1
2
3
4
5
6
7
8
9
if (条件) {
语句
}
else if (条件) {
语句
}
else {
语句
}

while/do-while

1
2
while (条件) 语句
do 语句 while (条件)

for循环

1
2
for (初始化; 条件; 迭代) 语句
for (i in 数组) 语句 # 遍历数组下标

未完待续