awk常用用法
1. 提取某一列的字段
为了便于举例子说明,准备了一个小的数据文件(ip_cluster.txt),如下
ip core_num model_name 11.20.51.204 16 example_gbdt 11.20.51.205 16 example_gbdt 11.20.51.203 16 example_gbdt 11.20.246.134 16 example_gbdt 11.20.246.133 16 example_gbdt 11.20.246.131 8 example_dnn 11.20.246.130 8 example_dnn 11.20.246.129 8 example_dnn 11.20.246.128 8 example_dnn 11.20.244.121 8 example_dnn
- 提取example_gbdt模型对应的机器
awk '{if ($3=="example_gbdt") {print $1}}' ip_cluster.txt # 如果模型名字放到了 model_name 变量里,注意引号的区别 model_name=example_gbdt awk '{if ($3=="'$model_name'") {print $1}}' ip_cluster.txt
上面的命令也可以省略 if(),而直接写判断条件。但我个人觉得,从程序更容易被人理解的角度,应该加上 if 字样。
2. 交互式输入
如果不加后面的文件(ip_cluster.txt),awk会停在那里,等待用户交互式输入,没输入一行(在awk里叫一条record),进行一次处理。
也可以通过管道进行输入,如
cat ip_cluster.txt | awk ...
3. 定义变量
# 定义内建变量
awk 'BEGIN{OFS=","}{print $1,$2,$3}' ip_cluster.txt
# 定义普通变量
awk 'BEGIN{a=1;b=2} {print a+b}'
4. 内建变量
常用的变量有
- NR:Number of Record,可以理解为行数
- NF:Number of Field,可以理解为列数
- FS:Field Separator,输入分隔符
- OFS:Out Field Separator,输出分隔符
5. 输入多个文件
awk后面可以直接追加多个文件,处理时的效果仿佛将多个文件拼接到一起一样。
6. 列赋值,人工打码
awk '{$3="xxxx";print $0}' ip_cluster.txt # 输出效果 ip core_num xxxx 11.20.51.204 16 xxxx 11.20.51.205 16 xxxx 11.20.51.203 16 xxxx 11.20.246.134 16 xxxx 11.20.246.133 16 xxxx 11.20.246.131 8 xxxx 11.20.246.130 8 xxxx 11.20.246.129 8 xxxx 11.20.246.128 8 xxxx 11.20.244.121 8 xxxx
7. 与正则表达式的配合
# 正则表达式写在两个斜杠之间 awk '/example_.*/{print $0}' ip_cluster.txt
简要回顾下基础的正则表达式
- ^开始,$结尾
- [] 一个字符,取或的关系,如 [xyz], [a-zA-Z], [^a-z] 说明:中括号里的 “^” 表示取反
- * 出现零次或多次
- + 出现一次或多次
- ?可以有也可以没有
- {} ab{3}c,可以匹配 abbbc;{}里还可以是范围,如{3,4},{3,}
- ()一段东西看成一个整体,如(ab)+c,可以匹配 ababc
8. 总结
awk非常的强大,尤其是在行列式的数据集合上面,展现出了很强的表达能力。配合一个数据文件,堪比小型数据库。