AWK 用法总结
语法: awk [Options] ‘script’ var=value files
常用命令选项:
- -F fs fs指输入指定的分隔符
- -v var=value 赋值一个用户定义变量
- -f script 从脚本中读取awk命令
awk简介:
操作由一个或者多个命令、函数、表达式组成、之间有换行符或者分号隔开,并且位于大括号内
awk ‘BEGIN{print “start”} pattern{command} END{print “end”}’ file
一个awk脚本通常由 BEGIN语句块 、 pattern语句块 、 END语句块 三部分组成,这三部分是可选的,任意一个部分都可以不出现在脚本中,脚本通常在单引号或双引号中
例子:
awk ‘BEGIN{i=0} {i++} END{print i}’ filename
awk ”BEGIN{i=0} {i++} END{print i}” filename
awk工作原理:
awk BEGIN{print “start”} pattern{command} END{print “end”}’
- 执行 BEGIN 中的语句块
- pattern 逐行扫描文件,从第一行至最后一行,重复处理过程
- 当读至输入流末尾时,执行END{}语句块
awk内置变量:
- $n 当前记录的第n个字段
- $0 当前行的文本内容
- NR 表示记录数
- FS 表示字段分隔符,默认为空格
- NF 表示字段数
- OFS 输出字段分隔符
- RS 记录分隔符,默认是换行符
- ORS 输出记录分隔符
举例:
awk "{print $2 , $3}" filename 打印每一行的第二和第三个字段
awk "END{print NR}" filename 统计文件中的行数
var=10000
echo | awk -v varrable=$var "{print variable}"
var1="aaa"
var2="bbb"
echo | awk "{print v1 , v2}" vi=$var1 v2=$var2
awk算术运算符:
- ± 加减
- */& 乘除求余
- ±! 一元加减逻辑非
- ^*** 求幂
- +±- 增加或减少
awk “BEGIN { a=“b” ; print a++ , ++a;}”
注意: 所有用作算术运算符额操作,操作数自动转换为数值,所有非数值都变为0
赋值运算符:
= += -= *= /= %= ^= *=
逻辑运算符:
|| &&
正则运算符:
~ ~!
awk "BEGIN {a=“100test” ; if(a ~ /^100/){print “ok”}}"
关系运算符:
< <= >= != ==
awk “BEGIN {a=10 ; if(a >= 9){print “ok”}}”
//awk高级输入输出: next
awk 'NR%2==1{next}{print NR , $0;}' text.txt
next 语句一般用于多行合并
//awk getline 用法:
awk "BEGIN{“”date“ | getline out; print out”}" //执行linuxdate命令,并将结果管道给getline,把输出值赋值给自定义变量,并打印
awk “BEGIN{ "date" | getline out; split(out , mon); print mon[2]}” //分割
awk "BEGIN{while("ls" | getline) print)}" 等于 awk "BEGIN{while("ls" | getline out){ print out})}"
//输出到一个文件中:
echo | awk '{ print ("hello world") > filename}'
echo | awk '{ print ("hello world") >> filename}'
//设置字段定界符: 默认为空格
awk -F : '{print $NF}' /etc/passwd
awk 'BEGIN{ FS=":" } { print &NF}' /etc/passwd
awk 中可使用 while do-while for if break continue exit等语句,与C语言保持一致,每句之间用;结尾
awk 数组:
awk中数组不必提前声明,也不必声明大小。数组元素用0或空字符串来初始化
数字做索引下标:
arra[1] = “sun”
arra[2] = “kai”
字符串做数组索引:
arra[“first”] = “www”
arra[“lat”] = “name”
读取数组的值
{ for (item in array){print array[item]};} 输出顺序是随机的
{for (i = 1 ; i< len; i++){ print array[i]}} len 是数组的长度 length(array)得到数组的长度;