computer_knowledge_notes/Software/awk.md

3.0 KiB
Raw Blame History

简介

awk是一种语言用于处理文本文件。这个名字来源于三个创始人的首字母。

语法

awk [options] -f <script-file> [--] file	// 用脚本处理文件
awk [options] [--] <script>  file			// 用命令处理文件

选项

-f, --file	# 指定要执行命令的脚本
-F, --field-separator	# 指定域的分割符(即预定义变量FS的值)

AWK程序执行

@include "filename"
@load "filename"
pattern {action statement}
function name(parameter list) {statements}

变量、记录和域

记录

一般来说,一行就是一条记录。但也可以通过修改变量RS来决定划分记录的方式。

记录再分割就是域,FS是域的划分规则。

$1, $2等代表了域的编号而$0则代表了记录本身。

变量NF代表了一个记录里域的数量。

内建变量

FILENAME : 当前输入文件的名字。

FS : 输入域的分割符,默认为空格。

NF : 当前输入记录里域的数量。

NR : 当前处理的是第几条记录。

OFMT : 数字的输出格式,默认为%.6g

OFS : 输出域的分隔符,默认为空格。

ORS : 输出记录的分隔符,默认为换行符。

RS : 输入记录的分隔符,默认为换行符。

模式和活动

模式在前,活动在后。

模式
BEGIN
END
BEGINFILE
ENDFILE
/正则表达式/		# 只有满足正则表达式的输入记录才会被执行
关联表达式
模式 && 模式	# 逻辑与
模式 || 模式	# 逻辑或
模式 ? 模式 : 模式	# 第1个模式为真则使用第2个模式,第1个模式为假则使用第3个模式
(模式)
! 模式		# 逻辑非
模式1, 模式2	# 从满足模式1的记录开始,到满足模式2的记录结束
正则表达式
活动

活动是花括号之间的语句{statements}

操作符
控制语句
if (condition) statement [else statement]
I/O语句
print		# 打印当前记录
print expr-list	# 打印表达式expr-list
print expr-list > file	# 将打印出来的表达式重定向到文件
printf语句
特殊文件名
数字函数
cos(expr)	# 余弦expr是弧度值
rand()		# 返回一个0到1之间的随机数
sin(expr)	# 正弦expr是弧度值
sqrt(expr)	# 平方根
字符串函数
length(str)		# 返回字符串的长度
tolower(str)	# 字符转化为小写
toupper(str)	# 字符转化为大写
substr(s,i,[,n])	# 返回从第i的字符开始最多n个字符的子串。如果不给定n则返回字符串全部剩余的部分
时间函数
位处理函数
国际化函数

用户定义的函数

动态加载新函数

信号

国际化

POSIX兼容

GNU扩展

环境变量

退出状态

例子

awk '{print $0}' demo.txt	# 打印demo.txt的内容

参考