AWK 使用文档

内容来源于awk英文教程

awk是类Unix环境下非常实用的文本处理和数据统计工具,非常实用。

awk的功能包含但不限于以下:

  • 文字处理;
  • 生成格式化的文本报告;
  • 执行算术运算;
  • 执行字符串操作。

要真正会使用awk,需要了解其内部结构,awk遵循一个简单的工作流程,读取 - 执行 - 重复。

awk工作流程

BEGIN语句块在程序开始的使用执行,它只执行一次,在这里可以初始化变量。BEGIN是AWK的关键字,因此它必须为大写,注意,这个语句块是可选的。

BODY 语句块

BODY语句块的语法

/pattern/ {awk-commands}

BODY语句块中的命令会对输入的每一行执行,我们也可以通过提供模式来控制这种行为。注意,BODY语句块没有关键字。

END 语句块

END语句块的语法

END {awk-commands}

END语句块在程序的最后执行,END是AWK的关键字,因此必须为大写,它也是可选的。

操作指令

  • 新建mark.txt文件用作演示
1)  Amit    Physics  80
2) Rahul Maths 90
3) Shyam Biology 87
4) Kedar English 85
5) Hari History 89

添加标题显示内容

  • command

awk 'BEGIN{printf "Sr No\tName\tSub\tMarks\n"} {print}' marks.txt

  • output
Sr No	Name	Sub	Marks
1) Amit Physics 80
2) Rahul Maths 90
3) Shyam Biology 87
4) Kedar English 85
5) Hari History 89

显示完整内容

  • command

awk '{print}' marks.txt

  • output
1)  Amit    Physics  80
2) Rahul Maths 90
3) Shyam Biology 87
4) Kedar English 85
5) Hari History 89

AWK脚本

可以新建一个文本文件command.awk,使用awk -f 指令运行,文件内容为{print}

  • Command

awk [options] -f file ....

  • Example

awk -f command.awk marks.txt

  • output
1)  Amit    Physics  80
2) Rahul Maths 90
3) Shyam Biology 87
4) Kedar English 85
5) Hari History 89

awk打印列或字段

  • 可以指示 AWK 仅打印输入字段中的某些列

awk '{print $3 "\t" $4}' marks.txt

Physics	80
Maths 90
Biology 87
English 85
History 89

注意:

  1. awk的参数中$0指的是所有,第一列是$1,以此类推

以任意顺序打印列

  • command
awk '{print $4 "\t" $3}' marks.txt
  • output
80	Physics
90 Maths
87 Biology
85 English
89 History

内置函数length()

  • 打印超过 18 个字符的行
  • command

awk 'length($0) > 18' marks.txt

  • output
1)  Amit    Physics  80
2) Rahul Maths 90
3) Shyam Biology 87
4) Kedar English 85
5) Hari History 89

✨:其他内置函数

使用正则表达式

  1. “.”匹配除行尾字符之外的任何单个字符
  • command

echo -e "cat\nbat\nfun\nfin\nfan" | awk '/f.n/'

  • output
fun
fin
fan
  1. “^”匹配行首
  • command

echo -e "This\nThat\nThere\nTheir\nthese" | awk '/^The/'

  • output
There
Their
  1. “$”匹配行尾
  • Example:以下示例打印以字母n结尾的行
  • command

echo -e "knife\nknow\nfun\nfin\nfan\nnine" | awk '/n$/'

  • output
fun
fin
fan
  1. 匹配字符集
  • Example1:示例匹配模式CallTall但不匹配Ball
  • command

echo -e "Call\nTall\nBall" | awk '/[CT]all/'

  • output
Call
Tall
  • Example2:示例仅打印Ball
  • command

echo -e "Call\nTall\nBall" | awk '/[^CT]all/'

  • output
Ball

组合统计

新建data.txt文件用作演示

91341221099321954R	341221000030145	临泉县雨祥汽车销售有限责任公司         
913401005957003047 340194000013436 合肥智取企业咨询有限公司
91341822MA2MQ6NM5N 341822000118001 广德佰联诚物业服务有限公司
913401000570032960 340100000713621 合肥欧庭装饰设计有限公司
91340828MA2MQ34B6X 340828000047935 岳西县好得快大药房有限公司
9134182132802708X7 341821000076048 郎溪杭联货物运输有限公司
913418220924818244 341822000097268 广德新希望双峰生态牧业有限公司
91340828MA2MQKF61B 340828000049004 岳西县利民中药材销售有限公司
91340121328104081D 340121000073888 合肥四周建筑装饰有限公司
913401003227683462 340100001144824 合肥恒炎金属制品有限公司
9134052239975222XQ 340522000025997 含山县吴楚新锐网络科技有限公司
91340824343893242W 340824000057838 潜山得胜钢化玻璃有限公司
91340100057027239F 340100000717145 合肥鹏荣园林工程有限公司

wc

  • command

wc data.txt

  • output

13 54 1108 data.txt

13: 行数(-l)

54: 字数(-w)

1108:字符数(-c)

wc -l : 显示行数

  • example:统计样本行数:
  • command

wc -l data.txt

  • output

13

grep 搜索

组合使用

  • example:统计统一信用代码为913401开头的样本个数
  • command

awk '{print $1}' data.txt | grep '913401'| wc -l

  • output

5