Awk 入门/标准函数
外观
< Awk 入门
以下是 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”。
下面,s 和 t 是字符串,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 兼容的系统上以长格式打印当前目录。
- gensub(regexp, s, h [, t]) 在字符串 t(默认为 $0)中用 s 替换 regexp 的第 h 个匹配项。例如,gensub(/o/, "O", 3, t) 将 t 中的第三个 "o" 替换为 "O"。
- 与 sub() 和 gsub() 不同,它返回结果,而字符串 t 保持不变。
- 如果 h 是以g或G开头的字符串,则替换所有匹配项。
- 与 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)。