跳轉至內容

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)。

華夏公益教科書