Linux awk学习

一、awk命令格式
awk option program file
-F fs               指定行中分隔数据字段分隔符
-f file             指定读取程序的文件名
-v var=value        定义awk程序中的一个变量及其默认值
-mf N               指定要处理的数据文件中的最大字段数
-mr N               指定数据文件中的最大数据行数
-W keyword          指定awk的兼容模式或警告等级
二、awk进阶
1、使用变量
awk支持两种不同类型的变量:内建变量,自定义变量。
1> 字段和数据行分隔符变量
数据字段变量允许使用$符号和数据字段在数据行中位置对应的数值来引用该数据行中的字段。因此,要引用数据行中的第一数据字段,就用$1。。。
字段是由字段分隔符来划定。默认情况下,字段分隔符是一个空白字符,也就是空格符或制表符(tab)。
awk数据字段和数据行变量
FIELDWIDTHS     由空格分隔开的定义了每个数据字段确切宽度的一列数字
FS              输入字段分隔符
RS              输入数据行分隔符
OFS             输出字段分隔符
ORS             输出数据行分隔符
$ cat data5
data11,data12,data13,data14,data15
data21,data22,data23,data24,data25
data31,data32,data33,data34,data35
$ awk 'BEGIN{FS=","} {print $1,$2,$3}' data5
data11 data12 data13
data21 data22 data23
data31 data32 data33
$ awk 'BEGIN{FS=",";OFS="-"} {print $1,$2,$3}' data5
data11-data12-data13
data21-data22-data23
data31-data32-data33
FIELDWIDTHS变量允许读取数据行,而不用字段分隔符来划分字段。在一些应用程序中,不用字段符,数据是被放置在数据行的某些列中。在这种情况下,你必须设定FIELDWIDTHS变量来匹配数据在数据行中的位置。这里是根据提供的字段宽度大小来计算字段。
$ cat data1b 
1005.3247596.37
115-2.349194.00
05810.1298100.1
$ awk 'BEGIN{FIELDWIDTHS="3 5 2 5"}{print $1,$2,$3,$4}' data1b 
100 5.324 75 96.37
115 -2.34 91 94.00
058 10.12 98 100.1
 
2> 数据变量
其它awk内建变量
ARGC          当前命令行参数个数
ARGIND        当前文件在ARGV中的位置
ARGV          包含命令行参数的数组
ERRNO         当读取或关闭输入文件发生错误时的系统错误号
FILENAME      用于awk输入数据的数据文件的文件名
FNR           当前数据文件中的数据行数
NF            数据文件中的字段总数
NR            已处理的输入数据行数目
$ awk 'BEGIN{print ARGC,ARGV[1]}' data1
2 data1
$ awk 'BEGIN{FS=",";OFS=","}{print $1,$NF}' data5
data11,data15
data21,data25
data31,data35
2、自定义变量
$ awk 'BEGIN{test="This is a test"; print test}'
This is a test
也可以在命令行上给变量赋值,即时改变变量的值。
$ cat script1
BEGIN{FS=","}
{print $n}
$ awk -f script1 n=2 data5
data12
data22
data32
3、处理数组
1> 定义数组变量
var[index] = element
例如:
capital["Ohio"] = "Columbus"
$ awk 'BEGIN{
> var[1] = 34
> var[2] = 3
> total = var[1] + var[2]
> print total
> }'
37
2> 遍历数组变量
for(var in array)
{
     statements
}
$ awk 'BEGIN{
var["a"] = 1
var["g"] = 2
var["m"] = 3
var["u"] = 4
for(test in var)
{
print "Index:",test," - Value:",var[test]
}
}'
Index: u  - Value: 4
Index: m  - Value: 3
Index: a  - Value: 1
Index: g  - Value: 2
3> 删除数组变量
delete array[index]
 
3、使用模式
1> 正则表达式
可以使用基本正则表达式(BRE)或扩展正则表达式(ERE)来过滤程序脚本作用在数据流中。
$ awk 'BEGIN{FS=","} /11/{print $1}' data5
data11
2> 匹配操作符
匹配操作符(matching operator)允许将正则表达式限定在数据行中的特定数据字段。匹配操作符是波浪线(~)。
$1~/^data/
这个表达式会过滤出第一个字段以文本data开头的所有数据行。
$ awk 'BEGIN{FS=","} $2~/^data2/{print $0}' data5
data21,data22,data23,data24,data25
$1 !~/expression/
表示排除正则表达式的匹配。
3> 数学表达式
可以使用任意的普通数学比较表达式
x==y
x<=y
x<y
x>=y
x>y
 
4、结构化命令
1> if语句
if(condition)
     statement1
$ cat data6
10
5
13
59
34
$ awk '{if($1 > 20) print $1}' data6
59
34
2> while语句
while(condition)
{
     statements
}
$ cat data7
130 120 135
160 113 140
145 170 215
$ awk '{total = 0; i = 1; while(i < 4) {total += $i; i++} avg = total/3; print "Average: ",avg}' data7
Average:  128.333
Average:  137.667
Average:  176.667
3> do-while语句
4> for语句
 
5、格式化打印
printf命令的格式:
printf "format string", var1, var2...
 
6、内建函数
1> 数学函数
awk一些数学函数
cos(x)
exp(x)
int(x)
log(x)
rand(x)
sqrt(x)
srand(x)
 
2> 字符串函数
asort(s [, d])
asorti(s [, d])
gsub(r, s, [, t])
index(s, t)
length([s])
 
7、自定义函数
function name([variables])
{
     statements
}
function myrand(limit)
{
     return int(limit * rand())
}
 
$ awk '
function myprint()
{
printf "%-16s - %s\n", $1, $4
}
BEGIN{FS=","}
{
myprint()
}' data5
data11           - data14
data21           - data24
data31           - data34
原文地址:https://www.cnblogs.com/sinaxyz/p/2824173.html