AWK
语言结构
- BEGIN{…}/pattern11/[,/pattern12/]{};/pattern21/[,/pattern22/]{…}END{…}
选项
- v 变量定义,BEGIN之前定义
内置变量
- NR 当前记录数
- NF 当前记录字段数
- FNR 在当前文件中的记录数
- FS 字段分隔符
- RS 记录分隔符
- OFS 输出字段分隔符
- ORS 输出记录分隔符
- RSTART match 函数匹配的开始位置,无匹配为0
- RLENGTH match 函数匹配的长度,无匹配为-1
数组
- 一维数组
- 定义 arr[key] = value
- 检查key是否在数组
if(key in arr)...
- 遍历
for(k in arr) {print arr[k]}
- 二维数组
- 定义 arr[k1, k2] = value
- 检查key是否在数组
if((k1,k2) in arr)...
- 遍历
for(k in arr) {
split(k, tmparr, SUBSEP)
print tmparr[0], tmparr[1], arr[tmparr[0], tmparr[1]]
}
内置函数
- sub(/pattern/, /replace/[,target])
- gsub(/pattern/, /replace/[,target])
- match(str, /pattern/[,arr])
- e.g.
match(hello123, /([a-z]+)([[:digit:]]+)/, arr)
print RSTART, RLENGTH
print arr[1, "start"], arr[1, "length"]
print arr[2, "start"], arr[2, "length"]
- e.g.
- split(str, /pattern/, arr)
- length(str)
- system(“cmd“)
- print …
- printf(“format\n”, …)
- sprintf(“format”, …)
e.g.v=sprintf("format", ...)
- substr(str, start[, length])
- getline 读取下一行覆盖$0, 不回到脚本开头,继续下一步操作
- e.g.
while("ls"|getline) {
print $0
}
- e.g.
- next 读取希一行覆盖$0,回到脚本头开始处理
- index(str,substr)
常用示例
- 计算某列平均值
BEGIN{sum=0}/pattern/{sum+=$n}END{print sum/NR}
- 移动当前目录下所有文件到指定目录
ls -F | grep -v '/$' | awk '{system("mv \""$0"\" dstdir")}'