awk 命令简明语法
awk 的本质是一个表格行处理器,优点在于处理大文件时不会内存溢出,处理速度比较快。
概念
awk 相当于一个小型的编程语言,支持:
- 样式装入
- 流控制
- 数学运算
- 流程控制
- 内置的变量和函数
基本用法
awk 每接受文件的一行,就会执行相应的命令。
awk '{pattern + action}' <file>
上述 pattern 代表在数据中要查找的内容,action 表示将要执行的一系列命令。
分隔符
awk
自动将一行分为多个字段,依次可以用 $1、
2
、
.
.
.
2、...
2、...n 来表示第一个字段、第二个字段、第 n 个字段。
例1:获取字段
awk '{print $2, $4, $6} file.txt'
指定分隔符
使用参数选项
在上述的标准格式之外,可以使用标签来额外执行分隔符。
默认情况下,对于一个行,awk 默认使用空格和制表符\t 作为分隔符号,得到 $1, $2, $…
vel: 2.8, acc: 0.5
上述行中,可以将 : 和 , 符号都指定为分隔符号,如下:
awk -F ':|,' '{print $2, $4, $6}' file.txt
内置变量
除了 $1 之后的内置变量有:
- $0:表示当前整行
- NR:表示当前已读的行数
- NF:表示当前行被分割的列数,NF 表示最后一列数,NF-1 表示倒数第二列数
- FILENAME:表示当前文件的名称
例3:一次打印出文件名、已读行、最后一列的列数
awk '{print FILENAME, NR, NF, ":", $0}' log
条件变量
awk
中的 pattern
可以进行条件判断。
例4:打印 val
值小于 5.0
的行,如下:
awk '$2 < 5.0 {print $0}' log
统计值
pattern
部分可以使用流程,从而完成操作操作。
例5:快速计算最大值。
以下的
pattern
部分是循环,能够遍历所有行的 $2 第二列,判断得到最大值。
awk -F ':|,' 'BEGIN {max=0} {if($2>max) max=$2} END {print "max vel:", max}' log
awk -F ':|,' 'BEGIN {min=10} {if($4<min) min=$4} END {print "min acc:", min}' log
awk -F ':|,' 'BEGIN {sum=0} {sum+=$6} END {print "mean steer:", sum/NR}' log
输出控制
awk 支持 print
和 printf
两种打印输出函数。
- print:输出变量、数值或字符串。
- printf:用法类似于 c 语言。
例6:awk实现head、tail命令。
awk 'NR<=10{print}' filename
awk '{buffer[NR%10] = $0;} END{for(i=0;i<11;i++){ \
print buffer[i %10]} } ' filename
其他程序。
awk '{chars+=length($0)+1;words+=NF} END{print NR,words,chars}' $1