命令 awk

awk 命令结构

awk -F "," '/^a/ {print $3}' f

-F 部分是参数

’ 内前面是范围,后面是操作

awk 语言的数组下标是从 1 开始的,0 表示整个原始字符串。

详细命令

比如 netstat 命令打印的网络状况如下:

其中第六列显示了网络状态,我们使用 awk 统计一下各网络状态的数目。脚本如下

netstat  -ant | 
awk ' \\
    BEGIN{print  "State","Count" }  \\
    /^tcp/ \\
    { rt[$6]++ } \\
    END{  for(i in rt){print i,rt[i]}  }'

输出结果如下

LISTEN 14
TIME_WAIT 3
ESTABLISHED 16

从上面可以看出,awk 的命令分为四个部分

  • BEGIN 开头部分,可选。用来设置一些参数,输出一些表头,定义一些变量。

  • END 结尾部分,可选。用来计算一些汇总逻辑,或者输出内容。

  • Pattern 匹配部分,可选,用来匹配一些需要处理的行。

  • Action 部分。主要逻辑体,按行处理。

内置变量

FS 输入内容分隔符

下面两个命令是等价的

awk -F ";" '{print $3}' file
awk 'BEGIN{FS=";"}{print $3}' file
# fs 可以指定多个,比如 FS="[,;|]"

OFS 输出内容分隔符

列数非常多的时候,可以指定输出的分隔符。

awk 'BEGIN{FS=";";OFS="-"}{print $1,$2,$3}' file

NF 列数

awk '{if(NF==3){print}}' file

NR 行号

awk '{print NR,$0}' file

基本命令

# 打印某一列
awk '{print $1}' file

-F 参数可以指定分隔符,比如打印 csv 文件中的第一列和第二列

awk -F "," '{print $1,$2}' file

高级输出

print 语句可以快速而简单的输出,printf 语句则可以按照需要格式化输出。

printf 的语句格式如下

printf(format, value1, value2, ..., valueN)

{printf("total pay for %s is %.2f\\n", $1, $2*$3)}

取出某行某列的元素

$ cat a.txt
a b c
d e f
g h i
$ cat a.txt | awk ''NR==2 {print $3}'
f

Awk 结果存入数组

array=($(ps -ef|grep abc |awk '{print $2}'))

参考

Linux生产环境上,最常用的一套“AWK“技巧awk脚本语言编程指南