awk学习(1)
来源:互联网 发布:淘宝 不需要生产许可证 编辑:程序博客网 时间:2024/04/28 08:14
好文章http://www.linux.gov.cn/shell/awk.htm
一、处理方式
awk用于处理文本文件,awk的处理文本文件的方式是这样的,它逐行扫描文件,从第一行到最后一行,寻找匹配的特定模式的行,并在这些行上进行你想要的操作。如果没有指定处理动作,则把匹配的行显示到标准输出(屏幕),如果没有指定模式,则所有被操作所指定的行都被处理。
二、常用命令格式
1.awk [options] 'script' var=value files
2.awk [options] -f scriptfile var=value files
三、常用命令行选项
-F 域分隔符,如: -F,
-v var=value 传变量值
-f scriptfile 从脚本文件中读取命令
四、脚本组成
awk脚本由模式和操作组成
pattern {action}
两者是可选的
如果没有模式,则操作应用到全部记录
如果没有操作,则输出匹配全部记录
1.模式
/正则表达式/:使用通配符的扩展集。
如:awk '/test/{print $0;}' file 行包含test,则输出行
关系表达式:可以用下面运算符表中的关系运算符进行操作,可以是字符串或数字的比较。
- 如:awk -F, '$2 == 1 {print $0;}' file 以逗号为分隔符,如果第二个域等于1,则输出整个行
模式匹配表达式:用运算符~(匹配)和~!(不匹配)。
如:awk '$1~/test/{print $0;}' file 行中匹配有test,则输出行
模式,模式:指定一个行的范围。该语法不能包括BEGIN和END模式。
- 如:awk '/test1/,/test2/{print $0;}' file 将匹配模式test1和test2间的行输出
BEGIN:让用户指定在第一条输入记录被处理之前所发生的动作,通常可在这里设置全局变量。
如:awk 'BEGIN{var="test";}END{print var;}' file 开始时给var赋值,结束时打印var
END:让用户在最后一条输入记录被读取之后发生的动作。
如:awk 'BEGIN{var="test";}END{print var;}' file 开始时给var赋值,结束时打印var
2.操作
变量、数组赋值
- 如:var=1 name[1]=0 name[1]=1 var="test"等
输出命令
- 如:print等
函数调用
- 如:index,substr等
控制流
- if if-else for while等
五、awk内部变量
例如:有一个文件test和test1(两个文件一样),其中有如下行:
Test,1
test,2
abc,3
test,4
b,5
c,1
当前记录的第n个字段,字段间由FS分隔。
awk -F, '{print $1}' test
打印第一个域(列)
$0完整的输入记录。
awk -F, '{print $0}' test
打印文件中的每一行
ARGC命令行参数的数目。
awk -F, 'END{print ARGC}' test
参数为2个,awk和test
ARGIND命令行中当前文件的位置(从0开始算)。
awk -F, 'END{print ARGIND}' test
test在命令行的位置为1
ARGV包含命令行参数的数组。
awk -F, 'END{print ARGV[0],ARGV[1]}' test
打印awk test
CONVFMT数字转换格式(默认值为%.6g)
awk 'BEGIN{CONVFMT="%.6g"}END{a=172.345678;b=a"";print b;}' test
将数字a转换成字符串b时的转换格式
输出:172.346
ENVIRON环境变量关联数组。
awk -F, 'END{for(var in ENVIRON){print var,ENVIRON[var]}}' test
打印环境变量的名和值
ERRNO最后一个系统错误的描述。FIELDWIDTHS字段宽度列表(用空格键分隔)。替换FS分隔符
awk 'BEGIN{FIELDWIDTHS="1 2 1"}{print $1,$2}' test
打印出:
T es
t es
a bc
t es
b ,5
c ,1
当前文件名。
awk -F, '{print FILENAME}' test test1
打印出6个test和6个test1
FNR同NR,但相对于当前文件。
awk -F, '{print FNR,$0}' test test1
打印出:
1 Test,1
2 test,2
3 abc,3
4 test,4
5 b,5
6 c,1
1 Test,1
2 test,2
3 abc,3
4 test,4
5 b,5
6 c,1
字段分隔符(默认是任何空格)。
awk 'BEGIN{FS=","}{print FNR,$1}' test
打印出:
1 Test
2 test
3 abc
4 test
5 b
6 c
如果为真,则进行忽略大小写的匹配。
awk 'BEGIN{FS=",";IGNORECASE=1}/test/{print FNR,$1}' test
打印出:
1 Test
2 test
4 test
当前记录中的字段数。
awk 'BEGIN{FS=","}{print $0,"Number of Fields="NF}' test
打印出:
Test,1 Number of Fields=2
test,2 Number of Fields=2
abc,3 Number of Fields=2
test,4 Number of Fields=2
b,5 Number of Fields=2
c,1 Number of Fields=
当前记录数。
awk 'BEGIN{FS=","}{print $0,NR}' test test1
打印出:
Test,1 1
test,2 2
abc,3 3
test,4 4
b,5 5
c,1 6
Test,1 7
test,2 8
abc,3 9
test,4 10
b,5 11
c,1 12
数字的输出格式(默认值是%.6g)。
awk 'BEGIN{OFMT="%.4g"}END{print 172.345678;}' test
打印出:172.3
OFS输出字段分隔符(默认值是一个空格)。
awk 'BEGIN{FS=",";OFS=":"}{print $1,$2}' test
以冒号为分隔符输出
ORS输出记录分隔符(默认值是一个换行符)。
awk 'BEGIN{FS=",";OFS=":";ORS="/n/n"}{print $1,$2}' test
输出以/n/n为行分隔符
RLENGTH由match函数所匹配的字符串的长度。
awk 'END{match("hello test!",/st!$/);print RSTART,RLENGTH}' test
打印出:9 3 (从1开始数)
RS记录分隔符(默认是一个换行符)。
awk 'BEGIN{RS=","}{print $0;}' test
打印出:
Test
1
test
2
abc
3
test
4
b
5
c
1
一个空行
RSTART由match函数所匹配的字符串的第一个位置。
awk 'END{match("hello test!",/st!$/);print RSTART,RLENGTH}' test
打印出:9 3 (从1开始数)SUBSEP数组下标分隔符(默认值是/034)。
awk 'BEGIN{array[0,0]="test1";array[0,1]="test2";}END{for(var in array){print var,SUBSEP,array[var]}}' test
输出:其中SUBSEP替换了0,0中的逗号
00 test1
01 test2
- AWK 学习1
- awk学习(1)
- awk学习笔记-1
- awk 学习记录1
- Awk学习
- awk学习
- awk学习
- awk学习
- AWK学习
- awk 学习
- awk 学习
- awk学习
- awk学习
- AWK学习
- awk学习
- awk学习
- Awk学习
- awk学习
- 12个钉子一个天平,现知道只有一个和其它的重量不同,问能否称三次就能找到那个钉子。
- 电子商务未来10年迎来井喷期,战火10月重燃
- FreeSwitch添加新分机号
- 据说 有这些,说明 长大了……
- 啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊
- awk学习(1)
- 用EL和JSTL进行View层开发
- 啊啊 啊啊啊啊
- prim算法(C++实现)
- ACM大数之间求最大公约数
- 实时监控(折线图)
- POJ 2531(随机化思想)
- 有感于异常处理
- 10大经典佛语里的爱情----佛谈禅,我说爱