Linix : AWK的三种变体介绍

举报
Tiamo_T 发表于 2022/04/14 09:52:16 2022/04/14
【摘要】 awk 是一种用于操作和处理文本文件的强大语言。当文本文件中的行是记录格式时,它特别有用。

awk 是一种用于操作和处理文本文件的强大语言。当文本文件中的行是记录格式时,它特别有用。即包含由分隔符分隔的多个字段的记录。即使输入文件不是记录格式,您仍然可以使用 awk 进行一些基本的文件和数据处理。即使没有需要处理的输入文件,您也可以使用 awk 编写编程逻辑。

简而言之,AWK 是一种功能强大的语言,可以在日常工作中派上用场。

如果您是 awk 新手,请先阅读此Awk 介绍教程,它是Awk 教程系列的一部分。

AWK 的学习曲线远小于任何其他语言的学习曲线。如果您已经了解 C 程序,您将体会到学习 AWK 是多么简单易行。

AWK 最初由三位开发人员编写——A. Aho、BW Kernighan 和 P. Weinberger。所以,AWK 这个名字来源于这三位开发者的首字母。

以下是 AWK 的三种变体:

1.awk

AWK 是由 A. Aho、BW Kernighan 和 P. Weinberger 编写的原创 AWK。

2. nawk

NAWK 代表“新 AWK”。这是 AT&T 的 Awk 版本。

3.gawk

GAWK 代表“GNU AWK”。所有 Linux 发行版都带有 GAWK。这与 AWK 和 NAWK 完全兼容。

在 Linux 上,键入 awk 或 gawk 会调用 GAWK。awk 链接到 gawk,如下所示在 Linux 系统上。

# ls -l /bin/awk /usr/bin/awk
lrwxrwxrwx 1 root root  4 Jan  5 23:13 /bin/awk -> gawk
lrwxrwxrwx 1 root root 14 Jan  5 23:13 /usr/bin/awk -> ../../bin/gawk

下表总结了这些版本中可用的不同功能。正如您在下面看到的,gawk 是包含原始 awk 和 nawk 的所有功能的超集。

awk VS Nawk VS Gawk

以下基本内置变量 FS、OFS、RS、ORS、NR、NF 和 FILENAME 在所有版本的 awk 中都可用。

特征 描述 AWK NAWK GAWK
FS 输入字段分隔符 是的 是的 是的
OFS 输出字段分隔符 是的 是的 是的
RS 记录分隔符 是的 是的 是的
ORS 输出记录分隔符 是的 是的 是的
NR 记录编号 是的 是的 是的
NF 记录中的字段数 是的 是的 是的
FILENAME 包含正在处理的当前输入文件 是的 是的 是的

以下所有功能在原始 awk 中均不可用。它们在 nawk 或 gawk 中可用,如下所示。

特征 描述 NAWK GAWK
FNR 档案“记录编号” 是的 是的
ARGC 传递给 awk 脚本的总数或参数 是的 是的
ARGV 包含所有 awk 脚本参数的数组 是的 是的
ARGIND 索引 ARGV 以检索当前文件名 是的
SUBSEP 数组索引的下标分隔符 是的 是的
RSTART 匹配函数将 RSTART 设置为 str1 在 str2 中的起始位置 是的 是的
RLENGTH 匹配函数将 RLENGTH 设置为 str1 的长度 是的 是的
OFMT awk 使用它来决定如何打印值。默认为“%.6g” 是的 是的
ENVIRON 包含所有环境变量和值的数组 是的
IGNORECASE 默认值为 0。当设置为 1 时,字符串和正则表达式比较不区分大小写。 是的
ERRNO 包含 I/O 操作的错误消息。例如,在使用 getline 函数时。 是的
BINMODE n 设置 I/O 的二进制模式。n 可以是 1(输入文件)、2(输出文件)或 3(所有文件) 是的
CONVFMT 将数字转换为字符串时使用的格式。 是的
FIELDWIDTHS n n 是一个以空格分隔的数字,表示列宽。如果可用,gawk 将使用它而不是 FS。 是的
LINT n n 可以是一个数字。当 n 为非零数(表示为真)时,gawk 将显示致命、无效或警告 lint 消息(与 –lint 命令行相同) 是的
TEXTDOMAIN 这用于国际化。 是的
sub(str1,str2,var) 在输入字符串 (var) 中,str1 被替换为 str2,输出被存储回 var 是的 是的
gsub (str1, str2, var) 与 sub 相同,但全局。它对同一个输入字符串 (var) 进行多次替换。 是的 是的
match(str1,str2) 当 str1 存在于 str2 中时返回正数。 是的 是的
getline < file 从另一个输入文件中读取下一行。套装 $0, NF 是的 是的
getline var < file 从另一个输入文件中读取下一行并将其存储在变量(var)中 是的 是的
toupper(str) 将 str 转换为大写 是的
tolower(str) 将 str 转换为小写 是的
|& awk 命令与外部进程之间的两种通信方式 是的
systime() 纪元时间中的当前时间。与 strftime 结合使用。例如打印 strftime(“%c”,systime()) 是的
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。