【本文是通过学习http://www.zsythink.net/中awk相关的入门文章后个人进行练习、尝试后的一些总结。博文对本人学习awk帮助很大,在此表示感谢。】
awk的主要功能:文本格式化。按行处理,每次遇到回车,即认为一行结束。
awk的格式:awk [option] '[pattern]{action}' file1[,file2[,file3[,...filen]]]
示例中使用的test.txt文件的内容如下:
aaa:bbb ccc:ddd
eee:fff ggg:hhh iii:jjj
示例中使用的test文件的内容如下:
123 456 789
ABC DEF
举例正式开始:
1. awk ‘{print $2}’ test.txt
输出结果:
ccc:ddd
ggg:hhh
【注】
1)默认以空格为分隔符,将每行的内容分隔成段,第一段的内容赋值给变量$1,(注意,变量不能使用引号引起来,否则变量会被当做字符串处理)。
2)操作(option)——print $2,需要用'{}'引起来
2. awk '{print $1,$2}' test.txt
输出结果:因为用了逗号(,),所以结果中会用默认的输出间隔符(空格)将$1和$2的内容隔开
aaa:bbb ccc:ddd
eee:fff ggg:hhh
awk '{print $1 $2}' test.txt或
awk '{print $1$2}' test.txt
输出结果:$1和$2之间没有逗号,输出的结果会将$1和$2的内容直接连接,没有任何分隔符。
aaa:bbbccc:ddd
eee:fffggg:hhh
3. awk -F: '{print $2}' test.txt或
awk -v FS=':' '{print $2}' test.txt
输出结果:
bbb ccc
fff ggg
【注】-F:用来指定输入分隔符(-F)为“:”
当命令中需要用到内置变量(variable)时,需要在变量(FS)的前面加上-v选项。
4.awk -v OFS='***' '{print $1,$2}' test.txt
输出结果:
aaa:bbb***ccc:ddd
eee:fff***ggg:hhh
【注】内置变量OFS重新指定输出内容的列分隔符(示例中将输出分隔符设置为***),使得输出的结果,将$1和$2用“***”进行分隔。
$1和$2之间必须使用逗号分隔,否则命令中指定的输出分隔符不会生效。
5.awk '{print NR,NF}' test.txt
输出结果:
1 2
2 3
【注】输出每行的行号(NR)和每行的列数(NF)
6.awk '{print NR,$0}' test.txt test
输出结果:将2个文件的内容按照顺序依次给每行进行编号。
1 aaa:bbb ccc:ddd
2 eee:fff ggg:hhh iii:jjj
3 123 456 789
4 ABC DEF
7.awk '{print FNR,$0}' test.txt test
输出结果:给2个文件的内容各自给每行进行编号。
1 aaa:bbb ccc:ddd
2 eee:fff ggg:hhh iii:jjj
1 123 456 789
2 ABC DEF
8.awk '{print FILENAME,FNR,$0}' test.txt test
输出结果:
test.txt 1 aaa:bbb ccc:ddd
test.txt 2 eee:fff ggg:hhh iii:jjj
test 1 123 456 789
test 2 ABC DEF
【注】FILENAME变量中存储了当前处理的文件的文件名
8.awk -v RS=' ' '{print NR,$0}' test.txt
输出结果:
1 aaa:bbb
2 ccc:ddd
eee:fff
3 ggg:hhh
4 iii:jjj
【注】RS=' '将换行符指定为空格(默认的行分隔符是“回车符”)。请注意输出结果中的第2行内容中是包含回车的。
如果test.txt中有连续2个空格,则第二个空格仍被识别为一个行分隔符,会打印出一个空行。
8.awk -v ORS='***' '{print NR,$0}' test.txt
输出结果:
1 aaa:bbb ccc:ddd***2 eee:fff ggg:hhh iii:jjj
【注】ORS变量重新指定输出内容的行分隔符(示例中指定为“***”。不指定时,默认值是回车)。
【中间小结】注意区分FS、RS、OFS、ORS
9.awk 'BEGIN{print ARGV[0],ARGV[1],ARGV[2],ARGC}' test.txt test
输出结果:
awk test.txt test 3
【注】ARGV是一个数组,存储了命令行中的所有参数,下标以0开始,ARGV[0]固定存储"awk"。
ARGC存储命令行中的参数数量。
10.awk -v var1="qqq" -v var2="ppp" 'BEGIN{print var1,var2}' test.txt或
awk 'BEGIN{var1="qqq";var2="ppp";print var1,var2}' test.txt
输出结果:
qqq ppp
【注】如果要引用shell中其他地方已定义的变量,则必须使用第一种格式,即:
>>num=3
>>awk -v var=$num 'BEGIN{print var}' test.txt
暂时先总结这些,awk还有很多需要学习的,后续继续补充吧。