awk
基本语法
BEGIN {}
pattern1 {}
pattern2 {}
END {}
pattern 的选择,正则表达式
实用变量
可以在BEING或者-v后面修改这些值
| NF | 本行字段数目 |
| OFS | 输出分隔符 |
| FS |
输入分隔符,可用 -F: 指定为冒号
|
| FILENAME | 当前输入文件的名称 |
| NR | 记录数(行数) |
| ORS | 输出记录的分隔符(默认换行) |
| RS | 输入记录的分隔符(默认换行) |
| FNR | 当前记录序号 |
可以用正则表达式赋值,如 RS=:+ 表示行分隔符是1个或多个:
选项
| -F |
-F: 指定分隔符为冒号
|
| -v |
-v FS=":"
|
命令行参数
存在ARGV 数组中, 键值是数字
环境变量
存在ENVIRON数组中,键值是变量名字符串,如 ENVIRON["HOME"]
分支
if (?) ? else if (?) ? else ?
循环
while ()
?
for (;;)
?
array["map"] = 2
array[1] = 3
for (a in array)
print a, array[a]
# map 2
# 1 3
if("map" in array)
print "map is in array"
流程控制
| break | |
| continue | |
| next | 下一条记录 |
| nextfile | |
| exit exitcode |
输入
| getline |
从当前输入文件中读取下一条记录存入$0并更新NF, NR, FNR
|
|
| getline var |
存入var并更新 NR, FNR
|
|
| getline < file | 重定向 | |
| `cmd | getline` | 管道 |
管道例子:
"ls" | getline ; print $0
重定向
awk '{print $0 > "1.txt" }' b.cpp
执行外部程序
管道和输出重定向可以实现,也可以用system
system("ls")
函数
function f(a, b)
{
return a+b
}
f(1, 2)