AWK 使用文档及教程
AWK 使用文档
内容来源于awk英文教程。
awk是类Unix环境下非常实用的文本处理和数据统计工具,非常实用。
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  | 
添加标题显示内容
- command
 
awk 'BEGIN{printf "Sr No\tName\tSub\tMarks\n"} {print}' marks.txt
- output
 
Sr No Name Sub Marks  | 
显示完整内容
- command
 
awk '{print}' marks.txt
- output
 
1) Amit Physics 80  | 
AWK脚本
可以新建一个文本文件command.awk,使用awk -f 指令运行,文件内容为{print}
- Command
 
awk [options] -f file ....
- Example
 
awk -f command.awk marks.txt
- output
 
1) Amit Physics 80  | 
awk打印列或字段
- 可以指示 AWK 仅打印输入字段中的某些列
 
awk '{print $3 "\t" $4}' marks.txt
Physics 80  | 
注意:
- awk的参数中
$0指的是所有,第一列是$1,以此类推 
以任意顺序打印列
- command
 
awk '{print $4 "\t" $3}' marks.txt  | 
- output
 
80 Physics  | 
内置函数length()
- 打印超过 18 个字符的行
 - command
 
awk 'length($0) > 18' marks.txt
- output
 
1) Amit Physics 80  | 
✨:其他内置函数
使用正则表达式
- “.”匹配除行尾字符之外的任何单个字符
 
- command
 
echo -e "cat\nbat\nfun\nfin\nfan" | awk '/f.n/'
- output
 
fun  | 
- “^”匹配行首
 
- command
 
echo -e "This\nThat\nThere\nTheir\nthese" | awk '/^The/'
- output
 
There  | 
- “$”匹配行尾
 
- Example:以下示例打印以字母n结尾的行
 - command
 
echo -e "knife\nknow\nfun\nfin\nfan\nnine" | awk '/n$/'
- output
 
fun  | 
- 匹配字符集
 
- Example1:示例匹配模式Call和Tall但不匹配Ball
 - command
 
echo -e "Call\nTall\nBall" | awk '/[CT]all/'
- output
 
Call  | 
- Example2:示例仅打印Ball
 - command
 
echo -e "Call\nTall\nBall" | awk '/[^CT]all/'
- output
 
Ball  | 
组合统计
新建data.txt文件用作演示
91341221099321954R 341221000030145 临泉县雨祥汽车销售有限责任公司  | 
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

