跳转至内容

Awk 入门/标准函数

来自 Wikibooks,开放世界中的开放书籍

以下是 Awk 函数列表。可以省略的参数用方括号括起来。

数值函数

[编辑 | 编辑源代码]

数值函数用于处理数字。它们都返回一个数字,并且只有数值参数或根本没有参数。

  • int(x) 返回向零取整的 x。例如,int(-3.9) 返回 -3,而 int(3.9) 返回 3。
  • sqrt(x) 返回
  • exp(x) 返回
  • log(x) 返回 x 的自然对数。
  • sin(x) 返回,以弧度为单位。
  • cos(x) 返回,以弧度为单位。
  • atan2(y,x) 类似于 C 或 C++ 中的相同函数,有关更多信息,请参见下文。
  • rand() 返回 [0,1) 区间内的伪随机数(即至少为 0 且小于 1)。如果同一程序运行多次,某些实现(例如 GNU Awk 3.1.8)会生成相同的随机数序列,而其他实现(例如 mawk 1.3.3)每次都会生成不同的序列。
  • srand([x]) 将 x 设置为随机数种子。如果没有参数,它将使用当天的时间来设置种子。它返回上一个种子。

atan2(y,x) 返回以弧度表示的角度,使得

公式为

字符串函数

[编辑 | 编辑源代码]

字符串函数用于处理字符串。它们都至少有一个字符串参数,有时可以省略。对于大多数函数,所有参数都是字符串和/或正则表达式。

请注意,在 Awk 字符串中,字符从 1 开始编号。例如,在字符串“cat”中,字符号 1 是“c”,字符号 2 是“a”,字符号 3 是“t”。

下面,st 是字符串,regexp 是正则表达式。

  • length([s]) 返回 s 中的字符数(默认为 $0)。
  • substr(s, m [,n]) 返回 s 的子字符串,该子字符串从第 m 个字符开始,长度为 n 个字符。例如,substr("string", 3, 2) 返回“ri”。如果省略 n,或者如果 n 指定的字符数超过字符串中剩余的字符数,则该函数返回从第 m 个字符到最后一个字符的 s 的子字符串。对于负 m 或 n,行为未定义。gawk 将负 m 或 n 视为零。

  • split(s, A [,regexp]) 使用分隔符 regexp(默认值为 FS)将字符串 s 分割成字段数组 A。如果 regexp 为空("" 或 //),一些实现(例如 gawk)会将其分割成字符,另一些实现(例如 mawk 1.3.3)则返回包含整个字符串 s 的单元素数组。返回字段数量。
  • sprintf(format [,expression, ..., expression]) - 格式化表达式,类似于 C 和 C++ 中的 sprintf 函数,并返回结果。有关详细信息,请参阅维基百科文章
  • gsub(regexp, s [,t]) - 在 t(默认为 $0)中,用 s 替换 regexp 的所有匹配项。返回替换次数。
  • sub(regexp, s [,t]) - 在 t(默认为 $0)中,用 s 替换 regexp 的第一个匹配项。如果没有匹配项,则不执行任何操作并返回 0,否则返回 1。
    • 在 sub() 和 gsub() 中,字符串 s 中的&表示整个匹配的文本。使用\&表示字面量&。请注意,为了避免 Awk 字符串中的反斜杠转义,\&应该输入为\\&
  • index(s, t) - 返回 t 在 s 中第一次出现的索引,如果 s 不包含 t 则返回 0。例如:index("hahaha", "ah") 返回 2,而 index("hahaha", "foo") 返回 0。
  • match(s, regexp) - 类似于 index,但查找正则表达式而不是字符串。此外,将 RSTART 设置为返回值,将 RLENGTH 设置为匹配子字符串的长度,如果没有匹配则设置为 -1。如果匹配空字符串,则将 RSTART 设置为匹配项后第一个字符的索引(如果匹配项位于末尾,则为 length(s)+1),并将 RLENGTH 设置为 0。
  • tolower(s) - 返回 s 的副本,其中大写字符已转换为小写。
  • toupper(s) - 返回 s 的副本,其中小写字符已转换为大写。

系统函数

[编辑 | 编辑源代码]

只有一个系统函数。

  • system(s) 将字符串 s 作为命令运行。例如,system("ls -l") 运行命令"ls -l",该命令在 Linux 或任何其他与 Unix 兼容的系统上以长格式打印当前目录。

GNU Awk 扩展

[编辑 | 编辑源代码]

字符串函数

[编辑 | 编辑源代码]
  • gensub(regexp, s, h [, t]) 在字符串 t(默认为 $0)中用 s 替换 regexp 的第 h 个匹配项。例如,gensub(/o/, "O", 3, t) 将 t 中的第三个 "o" 替换为 "O"。
    • 与 sub() 和 gsub() 不同,它返回结果,而字符串 t 保持不变。
    • 如果 h 是以gG开头的字符串,则替换所有匹配项。
    • 与 sub() 和 gsub() 一样,字符串 s 中的&表示整个匹配的文本。使用\&表示字面量&。与之前一样,为了避免 awk 字符串中的反斜杠转义,\&应该输入为\\&
    • 与 sub() 和 gsub() 不同,字符串 s 中的\0&含义相同,而\1 ... \9表示第 1 个 ... 第 9 个带括号的子表达式。
      • 类似地,由于相同的原因,\0 ... \9应该输入为\\0 ... \\9

使用 gensub 的一些示例

  • print(gensub(/o/, "O", 3, "cooperation")) 打印cooperatiOn
  • print(gensub(/o/, "O", "g", "cooperation")) 打印cOOperatiOn
  • print(gensub(/o+/, "(&)", "g", "cooperation")) 打印c(oo)perati(o)n
  • print(gensub(/(o+)(p+)/, "<[\\1](\\2)>", "g", "I oppose any cooperation") 打印I <[o](pp)>ose any c<[oo](p)>eration
  • split 有一个额外的可选参数。如果您将其称为split(s, A [,regexp]),它将像以前一样工作,即使用分隔符 regexp(默认值为 FS)将字符串 s 分割成字段数组 A。但是,如果您将其称为split(s, A, regexp, B),它还会用分隔符填充数组 B。例如,split("s;tr;;ing", A, ";+", B) 将数组 A 设置为 ("s","tr","ind"),并将数组 B 设置为 (";", ";;")。
  • patsplit(s, A [,regexp [,B]]) 类似于split,但 regexp 指定模式的正则表达式而不是分隔符。例如,split("s;tr;;ing", A, ";+", B) 粗略类似于split("s;tr;;ing", A, "[a-z]+", B)。regexp 的默认值为 FPAT 而不是 FS。

数组函数

[编辑 | 编辑源代码]

下面,A 和 B 是数组。

  • length(A) 返回 A 的长度。
  • asort(A[,B]) - 如果未给出 B,则丢弃 A 的索引并对其值进行排序。A 的索引被替换为从 1 开始的连续整数。如果给出 B,则将 A 复制到 B,然后按上述方式对 B 进行排序,而 A 保持不变。返回 A 的长度。
  • asorti(A[,B]) - 如果未给出 B,则丢弃 A 的值并对其索引进行排序。排序后的索引成为新的值,从 1 开始的连续整数成为新的索引。与前面的情况一样,如果给出 B,则将 A 复制到 B,然后按上述方式对 B 的索引进行排序,而 A 保持不变。返回 A 的长度。

其他标准函数

[编辑 | 编辑源代码]

GNU Awk 还具有

  • 时间函数
  • 位操作函数
  • 国际化函数。

有关详细信息,请参阅手册页 (man gawk)。

华夏公益教科书