zshuangyan / blog

我的个人博客
2 stars 0 forks source link

awk入门 #25

Open zshuangyan opened 5 years ago

zshuangyan commented 5 years ago

awk命令格式

awk ’program’ input-file1 input-file2 ...

program是指awk程序的内容,需要用单引号围起来,程序后面可以跟一个或者多个文件,awk程序会按序处理这多个文件

如果希望多次使用program,可以把program的内容放入文件中,然后以-f选项来执行

awk -f program-file input-file1 input-file2 ...

program的语法格式

pattern {action}
pattern {action}
...

program是由一个或多个规则组成的,awk对读取到的每行,都会遍历程序中的所有规则。规则包含pattern和action两个部分(pattern部分可以省略,即为无条件执行action)。pattern是匹配规则,action是执行动作,action外边被两个大括号包围起来。类似shell的if then语法,只有被pattern匹配中后,才会触发action的执行。

pattern语法 和其他编程语言相似,pattern中一般使用关系表达式,例如: x > 34 是一个Pattern, 判断变量 x 与 34 是否存在大于的关系. x == y 是一个Pattern, 判断变量 x 与变量 y 是否存在等于的关系.

awk 提供 C 语言中常见的关系运算符:

>, <, >=, <=, ==, !=

此外, awk 还提供 ~ (match) 及 !~(not match) 用于正则匹配

其用法与涵义如下:

若 A 为一字符串, B 为一正则表达式(Regular Expression)

A ~ B 判断 字符串A 中是否 包含 能匹配(match)B表达式的子字符串.

A !~ B 判断 字符串A 中是否 不包含 能匹配(match)B表达式的子字符串.

例如 :

"banana" ~ /an/ 整个是一个Pattern.

因为"banana"中含有可以匹配 /an/ 的子字符串, 故此关系式成立(true),整个Pattern的值也是true.

action语法 action中最常见的就是执行print,打印出某行,某列,多个列的组合。下面我们来介绍在print表达式中常常会使用到的变量:

变量 含义
$0 当前 awk 读入的数据行
$1 数据行的第一列
NF $0上列的总数
NR 当前已读入的行数
FS 列的分隔符,默认为空格和tab,可以进行赋值
OFS 输出时列的分隔符,可以进行赋值

下面是一些例子:

  1. 查找mail-list中姓名包含li的条目

    $ awk ’$1 ~ /li/ { print $0 }’ mail-list
    Amelia 555-5553 amelia.zodiacusque@gmail.com F
    Julie 555-6699 julie.perscrutabor@skeeve.com F
  2. 打印第一列和倒数第二列

    $ awk '{print $1 $(NF-1)}' mail-list
  3. 打印行号

    $ awk '{print $NR $0}' mail-list
  4. 对某些列进行计算

    $ awk '{print $1 $2*$3}' input-file
  5. 以“:”作为列的分隔

    $ awk -F ':' '{print $1 $NF}' input-file

参考列表: Effective AWK Programming awk入门指南 awk中文手册