awk命令学习

awk命令

一、用法:

1、 awk [-F filed-separator] 'command' filename F是用来指定域分隔符,如果没有该选项,默认是按照空格分隔符处理。
command必须用引号引起来。
2、使用awk脚本

二、 域

awk中用$1,$2,$n指定域,$1,就代表第一个域,$2代表第二个域。但$0表示所有域。如:

awk -F : '{print $0}' input.file 按冒号分隔,打印所有域。
awk -F : '{print $1,¥3}' input.file 按冒号分隔,打印第一域和第三域。

大括号{}内部是实际的执行动作,一般都是打印动作。

三、模式

模式主要有两个特殊字段BEGIN,END。BEGIN会在任何文本动作之前执行,END是在所有文本处理动作执行之后执行。例子
awk -F: 'BEGIN {print "company emp_num salary\n"} {print $0} END {print "SUM END"}' sort_test.txt
ccompany emp_num salary
guge 50 3000
baidu 100 5000
sohu 100 4500
google 110 5000
SUM END

四、awk中正则表达式的应用

1、awk中有很多条件操作符,类似于C语言里的,比如>=,==,!=等等。但有两个关于正则表达式的要注意,一是匹配正则表达式~,不匹配正则表达式 !~。

1、匹配

~后面要紧跟正则表达式,前面可以用if语句。但if后的条件要用括号()括起来。例子:
awk -F: ‘{if($1~/guge/) print $0}' sort_test.txt

2、精确匹配

正则表达式一般都不是精确匹配,精确匹配可以用==之类的。
awk -F: '{if($1=="guge") print $0}' sort_test.txt

3、或匹配

awk -F: '{if($1~/guge|google/) print $1}' sort_test.txt

五、复合模式

复合模式就是利用类似于C语言的逻辑表达式,&&,||,!等。
awk -F: '{if($1=="guge" || $1=="google") print $1}' sort_test.txt

六、awk内置变量

1、NR表示从awk开始执行时,读取的数据次数,默认是换行分隔符,NR=Number of Record。

awk '{print NR $0}' sort_test.txt
1
2
3guge:50:3000
4baidu:100:5000 5sohu:100:4500
6google:110:5000

2、FNR是记录浏览文件的次数。在单一文件中和NR完全相同,如果是多个文件就不同了。

1
2
3guge:50:3000
1
2##lina
3
即每个文件都是重新计数。

3、NF表示目前的记录被分隔的个数。

awk -F: '{print NF,$0}' sort_test.txt
3guge:50:3000
3baidu:100:5000
3sohu:100:4500
3google:110:5000

4、用来在awk中设置域分隔符,域命令行-F功能相同。

其实内置变量还有很多,如OFS,ORS,RS等等,但我感觉常用的就是这几个。

后续要进一步学习awk操作符、内置字符串操作函数、awk数组等等。

--------EOF---------
微信分享/微信扫码阅读