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)