文章目录
关键参数
- -F:指定分隔符,将每行输入按分隔符截成若干段,可指定多个分隔符
- -f:指定脚本,脚本可以内含所有awk的参数,用脚本替代awk的参数
awk 格式
awk [-F|-f|-v] [对应参数] 'BEGIN{} {command} END{}' file
字段说明
- [-F|-f|-v] [对应参数]:指定分隔符,或者脚本、或者变量的,
对应参数中放入参数
,其中变量的指定格式是 var=value,-F为最常用命令 BEGIN{}
:是整个处理过程开始之前做的操作,相当于Junit的@BeforClass。一般变量初始化可在这里初始化,但是默认变量不初始化也有初始值,所以一般可不使用{command}
:针对awk处理的每一行的操作,最常用部分END{}
:类似BEGIN{}
,是整个处理过程结束之后的操作,相当于Junit的@AfterClass,一般可不用
awk 格式举例
统计当前目录下所有文件大小
ls -ll|awk -F " " 'BEGIN{sum = 0} {sum+=$5} END{print "total size " sum}'
其中 -F " "
可以不写,因为分隔符默认就是空格,BEGIN{sum = 0}
可以不写,因为变量初始化就是0,不用声明
awk 特殊值
$0
:代表当前处理的整个一行内容$1~$n
:代表被分隔符分割后,一行内的,指定段的内容- NF:代表当前处理行中,被分隔符分割后,一行内,字段个数,从1开始
$NF
:代表当前处理行中,被分隔符分割后,一行内,最后一个字段的内容(相当于$n)- NR:代表当前被处理行的编号,如果awk处理多个文件的话,各个文件之间不重置编号,从1开始
- FNR:代表当前被处理行的编号,如果awk处理多个文件的话,各个文件之间重置编号
- FS:代表awk当前任务中,input的行内分隔符是什么,默认是空格
- RS:代表awk当前任务中,input行之间的分隔符是什么,默认是换行符
- OFS:代表awk当前任务中,output输出的行内分隔符,默认是空格
- ORS:代表awk当前任务中,output输出的行之间的分隔符,默认是换行符
awk 特殊值举例
统计两个文件的差异
思路是,通过FNR,将第一个文件的所有行存到数组a中,当遍历到第二个文件的时候,进行判断对比,输出第二个文件行内容不存在第一个文件中的
awk 'NR==FNR{a[$0]}NR>FNR{ if(!($1 in a)) print $0}' success.txt result_data.txt|sort|uniq
列出当前目录下文件,按\t分割
ls -ll|awk -F" " 'ORS ="\t" {print $NF}'
awk 正则
- 正则的pattern是放在两个
/
之间的 - 正则的匹配使用的是如下
~
:代表匹配到!~
:代表不匹配
awk 正则举例
判断tcp的连接数
netstat -an|awk '$0 ~ /^tcp/ {++s}END{print "total tcp num " s }'
awk 数组
awk的数组是关联数据,和map类似,通过for in遍历是无序的,通过下标有序
awk 数组举例
统计tcp链接,各种状态的个数
netstat -an|awk '/^tcp/{++s[$NF]}END{for(a in s)print a,s[a]}'