1分钟懂awk-技不在深,够用就行
1.AWK (1)Aho、Weinberger、Kernighan三位发明者名字首字母; (2)一个行文本处理工具;
2.基本原理 2.1原理:逐行处理文件中的数据
2.2语法:
1 | awk 'pattern + {action}' |
---|
说明: (1)单引号”是为了和shell命令区分开; (2)大括号{}表示一个命令分组; (3)pattern是一个过滤器,表示命中pattern的行才进行action处理; (4)action是处理动作; (5)使用#作为注释; 例子:显示hello.txt中的第3行至第5行
1 | cat hello.txt | awk 'NR==3, NR==5{print;}' |
---|
2.3pattern说明 pattern参数可以是egrep正则中的一个,正则使用/pattern/ 例子:显示hello.txt中,正则匹配hello的行
1 | cat hello.txt | awk '/hello/' |
---|
说明: (1)pattern和action可以只有其一,但不能两者都没有; (2)默认的action是print; 例子:显示hello.txt中,长度大于100的行号
1 | cat hello.txt | awk 'length($0)>80{print NR}' |
---|
3.内置变量FS 分隔符,默认是空格NR 当前行数,从1开始NF 当前记录字段个数0 当前记录1~
1 | cat hello.txt | awk 'NR==3, NR==5{print $1,$NF}' |
---|
4.内置函数 gsub(r,s):在$0中用s代替r index(s,t):返回s中t的第一个位置 length(s):s的长度 match(s,r):s是否匹配r split(s,a,fs):在fs上将s分成序列a substr(s,p):返回s从p开始的子串
5.操作符 5.1运算符 类似于c,支持+、-、*、/、%、++、–、+=、-=等诸多操作;
5.2判断符 类似于c,支持==、!=、>、=>、~(匹配于)等诸多判断操作;
6.控制流程 6.1.BEGIN和END BEGIN和END本质是一个pattern。 BEGIN用于awk程序开始开始前,做一些初始化的工作; END用于awk程序结束前,做一些收尾的工作。 例子:统计字符个数
1 2 3 4 5 6 7 8 9 10 11 12 | awk ' BEGIN { count=0; } { count+=length($0); } END { print count; }' |
---|
6.2流程控制语句 (1)if(condition){}else{} (2)while{} (3)do{}while(condition); (4)for(init;condition;step){} (5)break/continue:如果有END,会执行END中的收尾工作 个流程控制语句用法几乎与c相同。
7.awk与shell的交互 (1)awk中使用shell中定义的变量:使用单引号即可;
1 2 3 4 5 | #!/bin/bash STR= "hello" echo | awk '{ print "'${STR}'" ; }' |
---|
(2)awk中使用shell命令:使用双引号,或者system命令;
1 2 3 4 | #!/bin/bash echo hello | awk '{ print $0 | "cat" }' |
---|
或者
1 2 3 4 | #!/bin/bash echo | awk '{ system( "date > date.txt" ) }' |
---|
(3)awk中的变量传出至shell:没有什么好方法,老老实实用文件吧; (4)getline:awk里,从文件中读取变量到awk中
1 2 3 4 5 6 7 | #!/bin/bash echo | awk '{ while (getline < "date.txt" ) { print $0; } }' |
---|
结束语:对不起,楼主欺骗了你,认真看完本文或许不止1分钟。不过,如果你真的认真阅读并超过了1分钟,相信你会有收获。
如果觉得有收获,欢迎点赞、转发、关注、阅读原文。