关闭

gawk基础

标签: awk
216人阅读 评论(0) 收藏 举报
分类:

gawk和awk基本是一样的,而且在现在的linux系统上,awk和gawk命令其实是指向同一个程序的。以前写过awk基础,有很多地方都没写清楚,所以补写一篇。
所使用的测试文件名为test.txt,其内容如下

animal1
name:dog
color:black

animal2
name:cat
color:white

animal3
name:pig
color:white

1.常用的内建变量

字段和数据行分隔符变量

变量 描述
FIELDWIDTHS 由空格分隔开的定义了每个数据字段确切宽度的一列数字
FS 输入字段分隔符(默认为空格)
RS 输入数据行分隔符(默认为换行)
OFS 输出字段分隔符(默认为空格)
ORS 输出数据行分隔符(默认为换行)

gawk ‘BEGIN{FS=”:”;OFS=”->”}{print $1,$2}’ test.txt
结果为

animal1->
name->dog
color->black
->
animal2->
name->cat
color->white
->
animal3->
name->pig
color->white

gawk ‘BEGIN{FIELDWIDTH=”4 1 5”}{print $1,$2,$3}’ test.txt
结果为

anim a l1
name : dog
colo r :blac

anim a l2
name : cat
colo r :whit

anim a l3
name : pig
colo r :whit

gawk ‘BEGIN{FS=”\n”;RS=”“}{print $2,$3}’ test.txt
结果为

name:dog color:balck
name:cat color:white
name:pig color:white

gawk ‘BEGIN{FS=”\n”;RS=”“;ORS=”->”}{print $2,$3}’ test.txt
结果为

name:dog color:balck->name:cat color:white->name:pig color:white->

通过这几个例子应该很容易理解这几个变量的功能了,接下来我们来看一些数据变量

数据变量

变量 描述
ARGC 当前命令行参数个数
ARGIND 当前文件在ARGV中的位置
ARGV 包含命令行参数的数组
CONVFMT 数字的转换格式(默认为%.6g)
ENVIRON 当前shell环境变量及其值组成的关联数组
ERRNO 当读取或关闭输入文件发生错误时的系统错误号
FILENAME 用作gawk输入数据的数据文件的文件名
FNR 当前数据文件中的数据行数
IGNORECASE 设成非零值时,忽略gawk命令中出现的字符串的字符大小写
NF 数据文件的字段总数
NR 已处理的输入数据行数目
OFMT 数字的输出格式(默认值为%.6g)
RLENGTH 由match函数所匹配的子字符串的长度
RSTART 由match函数所匹配的子字符串的起始位置

gawk ‘BEGIN{print ARGC,ARGV[0],ARGV[1]}’ test.txt
结果为

2 gawk test.txt

gawk ‘BEGIN{print ENVIRON[“HOME”]}’
我的结果为

/home/wpp

gawk -F: ‘{print NF,$NF}’ test.txt
结果为

1 animal1
2 dog
2 black
0
1 animal2
2 cat
2 white
0
1 animal3
2 pig
2 white

gawk ‘{print “FNR=”FNR,”NR=”NR}’ test.txt test.txt
结果为

FNR=1 NR=1
FNR=2 NR=2
FNR=3 NR=3
FNR=4 NR=4
FNR=5 NR=5
FNR=6 NR=6
FNR=7 NR=7
FNR=8 NR=8
FNR=9 NR=9
FNR=10 NR=10
FNR=11 NR=11
FNR=1 NR=12
FNR=2 NR=13
FNR=3 NR=14
FNR=4 NR=15
FNR=5 NR=16
FNR=6 NR=17
FNR=7 NR=18
FNR=8 NR=19
FNR=9 NR=20
FNR=10 NR=21
FNR=11 NR=22

2.自定义变量

gawk ‘BEGIN{a=1;b=”hello”;print a,b}’
结果为

1 hello

假如我们有一个名字为scriptawk的脚本,其内容如下

BEGIN{FS=”:”;print n}
{print $n}

我们执行gawk -f scriptawk n=1 test.txt
结果为


animal1
name
color

animal2
name
color

animal3
name
color

我们执行gawk -f scriptawk n=2 test.txt


dog
black


cat
white


pig
white

我们执行gawk -v n=2 -f scriptawk test.txt
结果为

2

dog
black


cat
white


pig
white

注意上面多出的2,这是因为当我们以n=2的方式定义变量时,BEGIN语句会在变量定义前执行,而以-v n=2的方式定义时,BEGIN会在定义后执行。

3.模式匹配

gawk -F: ‘/nam/{print $2}’ test.txt
结果为

dog
cat
pig

gawk -F: ‘$1~/nam/{print $2}’ test.txt
结果为

dog
cat
pig

gawk -F: ‘$1==”nam”{print $2}’ test.txt
结果为空

gawk -F: ‘$1==”name”{print $2}’ test.txt
结果为

dog
cat
pig

需要注意的是~是模糊匹配,==是精确匹配

gawk -F: ‘!/nam/{print $2}’ test.txt

animal1
color:black

animal2
color:white

animal3
color:white

说明:!表示不匹配

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:9403次
    • 积分:519
    • 等级:
    • 排名:千里之外
    • 原创:37篇
    • 转载:9篇
    • 译文:0篇
    • 评论:0条
    文章分类