gawk
1. 字段和记录分隔符变量
变量 | 描述 |
FIELDWIDTHS | 以空格分隔的数字列表,用空格定义每个数据字段的精确宽度 |
FS | 输入字段分隔符号 |
RS | 输入记录分隔符号 |
OFS | 输出字段分隔符号 |
ORS | 输出记录分隔符号 |
2. gawk 'BEGIN{FS=",";OFS="-"}{print $1,$2,$3}' data1 //是将读取的数据以“,”为分隔符读取,以“-”作为分隔符进行显示
3. gawk 'BEGIN{FIELDWIDTHS="3 5 2 5 "}{print $1,$2,$3,$4}' data1 //数字字符串由定义的宽度分隔并显示
例如:1005.3247596.37 输出为:100 5.324 75 96.37
4. gawk 'BEGIN{FS="\n";RS=""}{print $1,$4}' data1 //RS是将空行作为记录分隔符,FS是将换行符作为一个字段分隔符
5. 注意字段为gawt处理的列,记录为gawt处理的行
6. gawk内置变量
变量 | 描述 |
ARGC | 出现的命令行参数的个数 |
ARGIND | 当前正在处理的文件在ARGV中的索引 |
ARGV | 命令行参数数组 |
CONVFMT | 数字的转换格式。默认值为%.6g |
ENVIRON | 当前shell环境变量及其值的关联数组 |
ERRON | 当读取或关闭输入文件时发生错误的系统错误 |
FILENAME | 用于输入到gawt程序的数据文件的文件名 |
FNR | 数据文件的当前记录号 |
IGNORECASE | 如果设置为0,则忽略gawt命令中使用的字符串的大小写 |
NF | 数据文件中数据字段的个数 |
NR | 已处理的输入记录的个数 |
OFNT | 显示数字的输出格式,默认为%.6g |
RLENGTH | 匹配函数中匹配上的字符串的长度 |
RSTART | 匹配函数中匹配上的子字符串的开始索引 |
8. gawk 'BEGIN{print ENVIRON["HOME"];print ENVIRON["PATH"]}' //查看环境变量值
9. gawk 'BEGIN{FS=":";OFS=":"}{print $1,$NF}' /etc/passwd //输入以“:”分隔输出以":"分隔;NF是指字段个数
10. gawk 'BEGIN{FS=","};{print $1,"FNR="FNR,"NR="NR};END{print "There were ",NR,"records processed"}' data1 data1 //FNR本身是对单个文件记录,而NR则是对处理的数据进行的记录
11. gawk 'BEGIN{x=4;x=x*2+3;print x}'
12. gawk 'BEGIN{test="name";print test}'
13. 命令行中赋值变量
在script中
BEGIN{FS=","}
{print $n}
$gawk -f script n=2 data1
$gawk -v n=2 -f script data1//在BEGIN之前对n进行赋值
14. 使用数组
$gawk 'BEGIN{
>var["a"]=1
>var["g"]=2//定义数组变量
>for (test in var)//在数组中递归
>{
> print "Index:",test,"- Value:",var[test]
>}
>delete var["g"]//删除数组变量
>print "-----"
>for (test in var)
>{
> print "Index:",test,"- Value:",var[test]
>}
>}'
15. 使用模式
波浪号(~)作为匹配操作符,操作例如:$1 ~ /^data/
$gawk 'BEGIN {FS=","}$2 ~ /^data/{print $0}' data1 //模式匹配在第二列并打印全行
$gawk -F: '$1 ~ /rish/{print $1,$NF}' /etc/passwd //以:为分隔符在第一列匹配
否定正则表达式例如: $1 ~ /expression/
$gawk 'BEGIN{FS=","}$2 ! ~ /^data/{print $1}' data1
16. 数学表达式的使用
数学表达式形式:
x==y
x<=y
x<y
x>=y
x>y
$gawk -F: '$4 == 0 {print $1}'/etc/passwd
此形式还可以用于文本数据不过要注意的是数据必须与模式精确匹配
$gawk -F: '$1 == "data"{print $1}' data1
17. 结构化语言
(1) if语句:
一种形式:
第二种形式:
格式:if {condition}statement; else statement2
$gawk 'BEGIN{if($1 > 20)print $1*2; else print $1 / 2}' data4
(2) while语句在语句内部可以使用break和continue
$gawk 'BEGIN{
>total =0;
>i=1
>while (i<4)
>{
> total +=$1
> if(i==2)
> break
> i++
>}
>avg=total / 2
>print "the average od the first two data elements is :",avg
>}' data5
(3)do-while 语句
格式:
do
{
statements
}while (condition)
例如:
$gawk '{
>i=1
>do
>{
> i++;
>}while(i<29)
>print i}'
(4)for 语句
$gawk 'BEGIN{
>total =0
>for (i=0;i<4;i++)
>{
> total+=$i
>}
>avg=total/3
>print "average:",avg
>}' data5
18. 格式化打印//类似C语言
printf "format string",var1,var2.....
19. gawk可以利用C语言的标准数学函数
并且还提供数据的位操作处理
and(v1,v2):执行v1和v2的与操作
compl(val):执行对val的补位
lshift(val,count):将值val向左移动count位
or(v1,v2):执行v1和v2的或操作
rshift(val,count):将值val向右移动count位
xor(v1,v2):执行v1和v2的异或操作
20. 字符串函数
21. 时间函数
22. gawk定义函数
函数一般类型:
function name([variables])
{
statements;
}
例如:
$gawk '
>function myprint()
>{
> printf "%-16-%s\n",$1,$4
>}
>BEGIN{FS="\n";RS=""}
>{
> myprint()
>}' data2
23. 创建函数库
操作: