awk命令

awk是什么?

awk - pattern-directed scanning and processing language.

标准用法

awk [ -F fs ] [ -v var=value ] [ 'prog' | -f progfile ] [ file ... ]

参数

-F 指定每行的分隔符
-vprog执行之前定义一些变量
'prog' 格式为pattern {action},pattern为匹配的模式,action为执行的操作
-f 方便过长的awk命令书写,以及加强awk的可读性,可单独将awk命令放在一个文件中
file 输入文件名,可以有多个

常用内置变量

$0 整行内容
$1,$2... 每行的第1,2...列内容(以参数FS分隔)
FILENAME 当前处理文件名
NR 当前处理文件行号
NF 当前行的列数量
FS 分隔符
... ...

用法介绍

awk命令的用处在于扫描输入文件inputfile的每行,进行pattern匹配,每个pattern会绑定一个action,匹配的pattern就执行相应的action
example,命令直接执行
这应该是awk最常见的用法了,匹配以M开始的行,输出每行的第1和第3列

localhost:~ shine$ cat inputfile 
name    id   math computer english
Marry   2143 78 84 77
Jack    2321 66 78 45
Tom     2122 48 77 71
Mike    2537 87 97 95
Bob     2415 40 57 62
localhost:~ shine$ awk '/^M/ {print $1,$3}' inputfile 
Marry 78
Mike 87

注意命令行中的程序是用单引号包围着的。这会防止shell解释程序中 $ 这样的字符,也允许程序的长度超过一行。

/^m/是pattern,必须用/.../包裹正则表达式
{print $1,$3}为action

  • 若pattern为空则每行都匹配
  • 若action为空则输出默认输出整行内容

pattern-action对也可以有多个,如

localhost:~ shine$ awk '/^M/ {print $1,$3} NR==1{print $1,$3}' inputfile 
name math
Marry 78
Mike 87

将命令放在单独文件awk.sh执行,以增强可读性
./awk.sh inputfile

#!/usr/bin/awk -f
BEGIN{
  mat=0
  eng=0
  comp=0
  FS="\t"
}
NR==1{
  #action部分
  mat+=$3
  eng+=$4
  comp+=$5
  if($3>80){
    print "great!"$1    
  }
  printf "%d %s %d %d %d\n",NR,$1,$3,$4,$5
}

NR==2{
  printf "hello world!"
}

END{
  print mat,eng,comp
}

执行方法
./awk.sh inputfile

BEGIN

在匹配pattern前,初始化一些变量

END

文件处理完成后的一些操作

pattern-action部分

和之前类似,用于匹配文本和操作
其中action中可以兼容C语言的一些基本语法,如if、for、while等

参考
man awk
awk简明教程

你可能感兴趣的:(awk命令)