自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

awk 中文man頁面

系統(tǒng)
awk 命令利用一組用戶提供的指令來將一組文件和用戶提供的擴展正則表達式比較,一次一行。然后在任何與擴展正則表達式匹配的行上執(zhí)行操作。

用途

在文件中查找與模式匹配的行,然后在它們上面執(zhí)行特定的操作。

語法

awk [ -F Ere ] [ -v Assignment ] ... { -f ProgramFile | 'Program' } [ [ File ... | Assignment ... ] ] ...

描述

awk 命令利用一組用戶提供的指令來將一組文件和用戶提供的擴展正則表達式比較,一次一行。然后在任何與擴展正則表達式匹配的行上執(zhí)行操作。awk 處理的***記錄大小為 10KB。

awk 命令的模式搜索比 grep 命令的搜索更常用,且它允許用戶在輸入文本行上執(zhí)行多個操作。awk 命令編程語言不需要編譯,并允許用戶使用變量、數(shù)字函數(shù)、字符串函數(shù)和邏輯運算符。

awk 命令受到 LANG、LC_ALL、LC_COLLATE、LC_CTYPE、LC_MESSAGES、LC_NUMERIC、NLSPATH 和 PATH 環(huán)境變量的影響。

本章中包括以下主題:

  awk 命令的輸入 

  awk 命令的輸出 

  通過記錄和字段的文件處理 

  awk 命令編程語言 

    模式 

    操作 

    變量 

    特殊變量

  標(biāo)志 

  示例

awk 命令的輸入

awk 命令采取兩種類型的輸入:輸入文本文件和程序指令。

輸入文本文件

搜索和操作在輸入文本文件上執(zhí)行。文件如下指定:

  在命令行指定 File 變量。 

  修改特殊變量 ARGV 和 ARGC。 

  在缺省 File 變量的情況下提供標(biāo)準(zhǔn)輸入。

如果用 File 變量指定多個文件,則文件以指定的順序處理。

程序指令

用戶提供的指令控制 awk 命令的操作。這些指令來自命令行的‘Program’變量或來自用 -f 標(biāo)志和 ProgramFile 

變量一起指定的文件。如果指定多個程序文件,這些文件以指定的順序串聯(lián),且使用指令的生成的順序。

awk 命令的輸出

awk 命令從輸入文本文件中的數(shù)據(jù)產(chǎn)生三種類型的輸出:

  選定的數(shù)據(jù)可以打印至標(biāo)準(zhǔn)輸出,此輸出完全同于輸入文件。 

  輸入文件的選定部分可以更改。 

  選定數(shù)據(jù)可以更改并可打印至標(biāo)準(zhǔn)輸出,此輸出可以同于或不同于輸入文件的內(nèi)容。

可以在同一個文件上執(zhí)行所有三種類型的輸出。awk 命令是別的編程語言允許用戶重定向輸出。

通過記錄和字段的文件處理

文件以下列方式處理:

  awk 命令掃描它的指令,并執(zhí)行任何指定為在讀取輸入前發(fā)生的操作。 

  awk 編程語言中的 BEGIN 語句允許用于指定在讀取***個記錄前要執(zhí)行的一組指令。這對于初始化特殊變量特別有用。

  從輸入文件讀取一個記錄。 

  記錄是由記錄分隔符隔開的一組數(shù)據(jù)。記錄分隔符的缺省值是換行字符,它使文件中的每一行成為一個單獨的記錄。記錄分隔符可以通過設(shè)置 RS 特殊變量來更改。

  記錄是相對于 awk 命令的指令指定的每種模式比較。 

  命令指令可以指定應(yīng)比較記錄內(nèi)的特定字段。缺省情況下,字段由空白區(qū)(空格或跳格)隔開。每個字段由一個字段變量表示。記錄中的***個字段指定為 $1 

  變量,第二個字段指定為 $2 變量,以此類推。整個記錄指定為 $0 變量。字段分隔符可以通過在命令行使用 -F 標(biāo)志或通過設(shè)置 FS 特殊變量來更改。FS 

  特殊變量可以設(shè)置為下列值:空格、單個字符或擴展正則表達式。

  如果一個記錄與一個模式相匹配,則任何與該模式相關(guān)的操作都在該記錄上執(zhí)行。 

  在記錄和每個模式比較且執(zhí)行了所有指定操作以后,從輸入讀取下一個記錄;在從輸入文件讀取所有的記錄之前,該進程重復(fù)。 

  如果已經(jīng)指定了多個輸入文件,則下一個文件打開,且在讀取所有的輸入文件之前,該進程重復(fù)。 

  在讀取了***一個文件中的***一個記錄后,awk 命令執(zhí)行任何指定為在輸入處理后發(fā)生的指令。 

  awk 編程語言中的 END 語句允許用戶指定在讀取***一個記錄后要執(zhí)行的操作。這對于發(fā)送有關(guān) awk 命令完成了什么工作的消息特別有用。

awk 命令編程語言

awk 命令編程語言由以下格式的語句構(gòu)成:

Pattern { Action }

如果一個記錄與指定模式相匹配,或包含與該模式匹配的字段,則執(zhí)行相關(guān)的操作??梢灾付]有操作的模式,這種情況下,包含該模式的整行寫至標(biāo)準(zhǔn)輸出。為每個輸入記錄執(zhí)行指定的沒有模式的操作。

模式

在 awk 命令語言語法中使用四種類型的模式:

  正則表達式 

  關(guān)系表達式 

  模式的組合 

  BEGIN 和 END 模式

正則表達式

awk 命令使用的擴展正則表達式類似于 grep 或 egrep 命令使用的表達式。擴展正則表達式的最簡單的形式就是包括在斜杠中的一串字符。例如,假定一個名為 

testfile 的文件具有以下內(nèi)容:

smawley, andy

smiley, allen

smith, alan

smithern, harry

smithhern, anne

smitters, alexis

輸入以下一行命令:

awk '/smi/' testfile

將把包含 smi 字符串的具體值的所有記錄打印至標(biāo)準(zhǔn)輸出。在這個示例中,awk 命令的程序 '/smi/' 是一個沒有操作的模式。輸出是:

smiley, allen

smith, alan

smithern, harry

smithhern, anne

smitters, alexis

以下特殊字符用于形成擴展正則表達式:

      字符功能

      +指定如果一個或多個字符或擴展正則表達式的具體值(在 +(加號)前)在這個字符串中,則字符串匹配。命令行: 

awk '/smith+ern/' testfile

      將包含字符 smit,后跟一個或多個 h 字符,并以字符 ern 結(jié)束的字符串的任何記錄打印至標(biāo)準(zhǔn)輸出。此示例中的輸出是:

smithern, harry

smithhern, anne

 

      ?指定如果零個或一個字符或擴展正則表達式的具體值(在 ?(問號)之前)在字符串中,則字符串匹配。命令行: 

awk '/smith?/' testfile

      將包含字符 smit,后跟零個或一個 h 字符的實例的所有記錄打印至標(biāo)準(zhǔn)輸出。此示例中的輸出是:

smith, alan

smithern, harry

smithhern, anne

smitters, alexis

 

      |指定如果以 |(垂直線)隔開的字符串的任何一個在字符串中,則字符串匹配。命令行: 

awk '/allen 

alan /' testfile

      將包含字符串 allen 或 alan 的所有記錄打印至標(biāo)準(zhǔn)輸出。此示例中的輸出是:

smiley, allen

smith, alan

 

      ( )在正則表達式中將字符串組合在一起。命令行: 

awk '/a(ll)?(nn)?e/' testfile

      將具有字符串 ae 或 alle 或 anne 或 allnne 的所有記錄打印至標(biāo)準(zhǔn)輸出。此示例中的輸出是:

smiley, allen

smithhern, anne

 

      {m}指定如果正好有 m 個模式的具體值位于字符串中,則字符串匹配。命令行: 

awk '/l{2}/' testfile

      打印至標(biāo)準(zhǔn)輸出

smiley, allen

 

      {m,}指定如果至少 m 個模式的具體值在字符串中,則字符串匹配。命令行: 

awk '/t{2,}/' testfile

      打印至標(biāo)準(zhǔn)輸出:

smitters, alexis

 

      {m, n}指定如果 m 和 n 之間(包含的 m 和 n)個模式的具體值在字符串中(其中m <= n),則字符串匹配。命令行: 

awk '/er{1, 2}/' testfile

      打印至標(biāo)準(zhǔn)輸出:

smithern, harry

smithern, anne

smitters, alexis

 

      [String]指定正則表達式與方括號內(nèi) String 變量指定的任何字符匹配。命令行: 

awk '/sm[a-h]/' testfile

      將具有 sm 后跟以字母順序從 a 到 h 排列的任何字符的所有記錄打印至標(biāo)準(zhǔn)輸出。此示例的輸出是:

smawley, andy

 

      [^ String]在 [ ](方括號)和在指定字符串開頭的 ^ (插入記號) 指明正則表達式與方括號內(nèi)的任何字符不匹配。這樣,命令行: 

awk '/sm[^a-h]/' testfile

      打印至標(biāo)準(zhǔn)輸出:

smiley, allen

smith, alan

smithern, harry

smithhern, anne

smitters, alexis

 

      ~,!~表示指定變量與正則表達式匹配(代字號)或不匹配(代字號、感嘆號)的條件語句。命令行: 

awk '$1 ~ /n/' testfile

      將***個字段包含字符 n 的所有記錄打印至標(biāo)準(zhǔn)輸出:

smithern, harry

smithhern, anne

 

      ^指定字段或記錄的開頭。命令行: 

awk '$2 ~ /^h/' testfile

      將把字符 h 作為第二個字段的***個字符的所有記錄打印至標(biāo)準(zhǔn)輸出。此示例中的輸出是:

smithern, harry

 

      $指定字段或記錄的末尾。命令行: 

awk '$2 ~ /y$/' testfile

      將把字符 y 作為第二個字段的***一個字符的所有記錄打印至標(biāo)準(zhǔn)輸出。此示例中的輸出是:

smawley, andy

smithern, harry

 

      .(句號)表示除了在空白末尾的終端換行字符以外的任何一個字符。命令行: 

awk '/a..e/' testfile

      將具有以兩個字符隔開的字符 a 和 e 的所有記錄打印至標(biāo)準(zhǔn)輸出。此示例中的輸出是:

smawley, andy

smiley, allen

smithhern, anne

 

      *(星號)表示零個或更多的任意字符。命令行: 

awk '/a.*e/' testfile

      將具有以零個或更多字符隔開的字符 a 和 e 打印至標(biāo)準(zhǔn)輸出。此示例中的輸出是:

smawley, andy

smiley, allen

smithhern, anne

smitters, alexis

 

      \ (反斜杠)轉(zhuǎn)義字符。當(dāng)位于在擴展正則表達式中具有特殊含義的任何字符之前時,轉(zhuǎn)義字符除去該字符的任何特殊含義。例如,命令行: 

/a\/\//

      將與模式 a // 

      匹配,因為反斜杠否定斜杠作為正則表達式定界符的通常含義。要將反斜杠本身指定為字符,則使用雙反斜杠。有關(guān)反斜杠及其使用的更多信息,請參閱以下關(guān)于轉(zhuǎn)義序列的內(nèi)容。

 

識別的轉(zhuǎn)義序列

awk 命令識別大多數(shù)用于 C 語言約定中的轉(zhuǎn)義序列,以及 awk 命令本身用作特殊字符的幾個轉(zhuǎn)義序列。轉(zhuǎn)義序列是:

      轉(zhuǎn)義序列表示的字符

      \"\"(雙引號)

      \//(斜杠)字符

      \ddd其編碼由 1、2 或 3 位八進制整數(shù)表示的字符,其中 d 表示一個八進制數(shù)位

      \\\ (反斜杠) 字符

      \a警告字符

      \b退格字符

      \f換頁字符

      \n換行字符(請參閱以下的注)

      \r回車字符

      \t跳格字符

      \v垂直跳格

 

  注:除了在 gsub、match、split 和 sub 

  內(nèi)置函數(shù)中,擴展正則表達式的匹配都基于輸入記錄。記錄分隔符字符(缺省情況下為換行字符)不能嵌套在表達式中,且沒與記錄分隔符字符匹配的表達式。 如果記錄分隔符不是換行字符,則可與換行字符匹配。在指定的四個內(nèi)置函數(shù)中,匹配基于文本字符串,且任何字符(包含記錄分隔符)可以嵌套在模式中,這樣模 式與適當(dāng)?shù)淖址嗥ヅ?。然而,?nbsp;

  awk 命令進行的所有正則表達式匹配中,在模式使用一個或多個 NULL(空)字符將生成未定以的結(jié)果。

關(guān)系表達式

關(guān)系運算符 <(小于)、>(大于)、<=(小于或等于)、>=(大于或等于)、= =(等于)和 !=(不等于)可用來形成模式。例如,模式:

$1 < $4

將與***個字段小于第四個字段的記錄匹配。關(guān)系運算符還和字符串值一起使用。例如:

$1 =! "q"

將與***個字段不是 q 的所有記錄匹配。字符串值還可以根據(jù)校對值匹配。例如:

$1 >= "d"

將與***個字段以字符 a、b、c 或 d 開頭的所有記錄匹配。如果未給出其它信息,則字段變量作為字符串值比較。

模式的組合

可以使用三種選項組合模式:

  范圍由兩種以 ,(逗號)隔開的模式指定。操作在每個以匹配***個模式的記錄開始的每個記錄上執(zhí)行,并通過匹配第二個模式的記錄(包含此記錄)繼續(xù)。例如: 

/begin/,/end/

  與包含字符串 begin 的記錄以及該記錄和包含字符串 end 之間的所有記錄(包含包括字符串 end 的記錄)匹配。

  括號 ( ) 將模式組合在一起。 

  布爾運算符 ||(或)&&(和)以及 !(不)將模式組合成如果它們求值為真則匹配,否則不匹配的表達式。例如,模式:

$1 == "al" && $2 == "123"

  與***個字段是 al 且第二個字段是 123 的記錄匹配。

BEGIN 和 END 模式

用 BEGIN 模式指定的操作在讀取任何輸入之前執(zhí)行。用 END 模式指定的操作在讀取了所有輸入后執(zhí)行。允許多個 BEGIN 和 END 

模式,并以指定的順序處理它們。在程序語句中 END 模式可以在 BEGIN 模式之前。如果程序僅由 BEGIN 語句構(gòu)成,則執(zhí)行操作且不讀取輸入。如果程序僅由 

END 語句構(gòu)成,則在任何操作執(zhí)行前讀取所有輸入。

操作

有多種類型的操作語句:

  操作語句 

  內(nèi)置函數(shù) 

  用戶定義的函數(shù) 

  條件語句 

  輸出操作

操作語句

操作語句括在 { } (花括號) 中。如果語句指定為沒有模式,則它們在每個記錄上執(zhí)行。在括號里可以指定多個操作,但操作間必須以換行字符或 

;(分號),且語句以它們出現(xiàn)的順序處理。操作語句包含:

      算術(shù)語句

      算術(shù)運算符 +(加號), - (減號), / (除號), ^ (冪), * (乘號), % (系數(shù))用于格式: 

表達式 運算符 表達式

      這樣語句為:

$2 = $1 ^ 3

      將***個升為三次方的字段的值指定給第二個字段。

      一元語句

      一元 -(減號)和一元 +(加號)如在 C 編程語言中操作: 

+Expression 或 -Expression

 

      增量和減量語句

      增量前語句和減量前語句如在 C 編程語言中操作: 

++Variable 或 --Variable

      增量后語句和減量后語句如在 C 編程語言中操作:

Variable++ 或 Variable--

 

      賦值語句

      賦值運算符 +=(加)、-=(減)、/=(除)和 *=(乘)如在 C 編程語言中操作,格式為: 

Variable += Expression

Variable -= Expression

Variable /= Expression

Variable *= Expression

      例如,語句:

$1 *= $2

      將字段變量 $1 乘以字段變量 $2,然后將新值指定給 $1。

      賦值運算符 ^=(冪)和 %=(系數(shù))具有以下格式:

Variable1^=Expression1

      和

Variable2%=Expression2

      并且它們等同于 C 編程語言語句:

Variable1=pow(Variable1, Expression1)

      和

Variable2=fmod(Variable2, Expression2)

      其中 pow 是 pow 子例程而 fmod 是 fmod 子例程。

      字符串串聯(lián)語句

      字符串值可以通過緊挨著陳述來串聯(lián)。例如: 

$3 = $1 $2

      將字段變量 $1 和 $2 中的字符串的串聯(lián)指定給字段變量 $3。

 

內(nèi)置函數(shù)

awk 命令語言使用算術(shù)函數(shù)、字符串函數(shù)和一般函數(shù)。如果打算編寫一個文件,且稍后在同一個程序里讀取它,則 close 子例程語句是必需的。

算術(shù)函數(shù)

以下算術(shù)函數(shù)執(zhí)行與 C 語言中名稱相同的子例程相同的操作:

      atan2( y, x )返回 y/x 的反正切。

      cos( x )返回 x 的余弦;x 是弧度。

      sin( x )返回 x 的正弦;x 是弧度。

      exp( x )返回 x 冪函數(shù)。

      log( x )返回 x 的自然對數(shù)。

      sqrt( x )返回 x 平方根。

      int( x )返回 x 的截斷至整數(shù)的值。

      rand( )返回任意數(shù)字 n,其中 0 <= n < 1。

      srand( [Expr] )將 rand 函數(shù)的種子值設(shè)置為 Expr 參數(shù)的值,或如果省略 Expr 參數(shù)則使用某天的時間。返回先前的種子值。

 

字符串函數(shù)

字符串函數(shù)是:

      gsub( Ere, Repl, [ In ] )除了正則表達式所有具體值被替代這點,它和 sub 函數(shù)完全一樣地執(zhí)行,。

      sub( Ere, Repl, [ In ] )用 Repl 參數(shù)指定的字符串替換 In 參數(shù)指定的字符串中的由 Ere 

      參數(shù)指定的擴展正則表達式的***個具體值。sub 函數(shù)返回替換的數(shù)量。出現(xiàn)在 Repl 參數(shù)指定的字符串中的 &(和符號)由 In 參數(shù)指定的與 

      Ere 參數(shù)的指定的擴展正則表達式匹配的字符串替換。如果未指定 In 參數(shù),缺省值是整個記錄($0 記錄變量)。

      index( String1, String2 )在由 String1 參數(shù)指定的字符串(其中有出現(xiàn) String2 指定的參數(shù))中,返回位置,從 

      1 開始編號。如果 String2 參數(shù)不在 String1 參數(shù)中出現(xiàn),則返回 0(零)。

      length [(String)]返回 String 參數(shù)指定的字符串的長度(字符形式)。如果未給出 String 參數(shù),則返回整個記錄的長度($0 

      記錄變量)。

      blength [(String)]返回 String 參數(shù)指定的字符串的長度(以字節(jié)為單位)。如果未給出 String 

      參數(shù),則返回整個記錄的長度($0 記錄變量)。

      substr( String, M, [ N ] )返回具有 N 參數(shù)指定的字符數(shù)量子串。子串從 String 參數(shù)指定的字符串取得,其字符以 M 

      參數(shù)指定的位置開始。M 參數(shù)指定為將 String 參數(shù)中的***個字符作為編號 1。如果未指定 N,則子串的長度將是 M 參數(shù)指定的位置到 

      String 參數(shù)的末尾 的長度。

      match( String, Ere )在 String 參數(shù)指定的字符串(Ere 參數(shù)指定的擴展正則表達式出現(xiàn)在其中)中返回位置(字符形式),從 

      1 開始編號,或如果 Ere 參數(shù)不出現(xiàn),則返回 0(零)。RSTART 特殊變量設(shè)置為返回值。RLENGTH 

      特殊變量設(shè)置為匹配的字符串的長度,或如果未找到任何匹配,則設(shè)置為 -1(負(fù)一)。

      split( String, A, [Ere] )將 String 參數(shù)指定的參數(shù)分割為數(shù)組元素 A[1], A[2], . . ., 

      A[n],并返回 n 變量的值。此分割可以通過 Ere 參數(shù)指定的擴展正則表達式進行,或用當(dāng)前字段分隔符 FS 特殊變量)來進行(如果沒有給出 

      Ere 參數(shù))。除非上下文指明特定的元素還應(yīng)具有一個數(shù)字值,否則 A 數(shù)組中的元素用字符串值來創(chuàng)建。

      tolower( String )返回 String 參數(shù)指定的字符串,字符串中每個大寫字符將更改為小寫。大寫和小寫的映射由當(dāng)前語言環(huán)境的 

      LC_CTYPE 范疇定義。

      toupper( String )返回 String 參數(shù)指定的字符串,字符串中每個小寫字符將更改為大寫。大寫和小寫的映射由當(dāng)前語言環(huán)境的 

      LC_CTYPE 范疇定義。

      sprintf(Format, Expr, Expr, . . . )根據(jù) Format 參數(shù)指定的 printf 子例程格式字符串來格式化 

      Expr 參數(shù)指定的表達式并返回***生成的字符串。

 

一般函數(shù)

一般函數(shù)是:

      close( Expression )用同一個帶字符串值的 Expression 參數(shù)來關(guān)閉由 print 或 printf 語句打開的或調(diào)用 

      getline 參數(shù)打開的文件或管道。如果文件或管道成功關(guān)閉,則返回 0;其它情況下返回非零值。如果打算寫一個文件,并稍后在同一個程序中讀取文件,則 

      close 語句是必需的。

      system(Command )執(zhí)行 Command 參數(shù)指定的命令,并返回出口狀態(tài)。等同于 system 子例程。

      Expression | getline [ Variable ]從來自 Expression 

      參數(shù)指定的命令的輸出中通過管道傳送的流中讀取一個輸入記錄,并將該記錄的值指定給 Variable 參數(shù)指定的變量。如果當(dāng)前未打開江 

      Expression 參數(shù)的值作為其命令名稱的流,則創(chuàng)建流。創(chuàng)建的流等同于調(diào)用 popen 子例程,此時 Command 參數(shù)取 

      Expression 參數(shù)的值且 Mode 參數(shù)設(shè)置為一個是 r 的值。只要流保留打開且 Expression 參數(shù)求得同一個字符串,則對 

      getline 函數(shù)的每次后續(xù)調(diào)用讀取另一個記錄。如果未指定 Variable 參數(shù),則 $0 記錄變量和 NF 特殊變量設(shè)置為從流讀取的記錄。

      getline [ Variable ] < Expression從 Expression 參數(shù)指定的文件讀取輸入的下一個記錄,并將 

      Variable 參數(shù)指定的變量設(shè)置為該記錄的值。只要流保留打開且 Expression 參數(shù)對同一個字符串求值,則對 getline 

      函數(shù)的每次后續(xù)調(diào)用讀取另一個記錄。如果未指定 Variable 參數(shù),則 $0 記錄變量和 NF 特殊變量設(shè)置為從流讀取的記錄。

      getline [ Variable ]將 Variable 參數(shù)指定的變量設(shè)置為從當(dāng)前輸入文件讀取的下一個輸入記錄。如果未指定 Variable 

      參數(shù),則 $0 記錄變量設(shè)置為該記錄的值,還將設(shè)置 NF、NR 和 FNR 特殊變量。

 

  注:所有 getline 函數(shù)的格式對于成功輸入返回 1,對于文件結(jié)束返回零,對于錯誤返回 -1。

用戶定義的函數(shù)

用戶定義的函數(shù)以下列格式說明:

function Name (Parameter, Parameter,...)  { Statements }

函數(shù)可以指向 awk 命令程序中的任何位置,且它的使用可以優(yōu)先于它的定義。此函數(shù)的作用域是全局的。

函數(shù)參數(shù)可以是標(biāo)量或數(shù)組。參數(shù)名稱對函數(shù)而言是本地的;所有其它變量名稱都是全局的。同一個名稱不應(yīng)用作不同的實體;例如,一個參數(shù)不能即用作函數(shù)名稱又用作特殊變量。具有全局作用域的變量不應(yīng)共享一個函數(shù)的名稱。同個作用域中的標(biāo)量和數(shù)組不應(yīng)具有同一個名稱。

函數(shù)定義中的參數(shù)數(shù)量不必和調(diào)用函數(shù)時使用的參數(shù)數(shù)量匹配。多余的形式參數(shù)可用作本地變量。額外的標(biāo)量初始化后具有等同于空字符串和數(shù)字值為 

0(零)的字符串值;額外的數(shù)組參數(shù)初始化為空數(shù)組。

當(dāng)調(diào)用函數(shù)時,函數(shù)名稱和左括號之間沒有空格。函數(shù)調(diào)用可以是嵌套的或循環(huán)的。從任何嵌套的或循環(huán)函數(shù)函數(shù)調(diào)用返回時,所有調(diào)用函數(shù)的參數(shù)的值應(yīng)保持不變,除了引用傳送的數(shù)組參數(shù)。return 

語句可用于返回一個值。

在函數(shù)定義內(nèi),在左 { (花括號) 之前和右 } (花括號) 之后的換行字符是可選的。

函數(shù)定義的一個示例是:

function average ( g,n) 

  {

        for (i in g)

           sum=sum+g[i]

        avg=sum/n

        return avg

  } 

數(shù)組 g 和變量 n 以及數(shù)組中的元素個數(shù)傳遞給函數(shù) average。然后函數(shù)獲得一個平均值并返回它。

條件語句

awk 命令編程語言中的大部分條件語句和 C 編程語言中的條件語句具有相同的語法和功能。所有條件語句允許使用{ } (花括號) 

將語句組合在一起??梢栽跅l件語句的表達式部分和語句部分之間使用可選的換行字符,且換行字符或 ;(分號)用于隔離 { } (花括號) 中的多個語句。C 

語言中的六種條件語句是:

      if需要以下語法: 

      if ( Expression ) { Statement } [ else Action ]

      while需要以下語法: 

      while ( Expression ) { Statement }

      for需要以下語法: 

      for ( Expression ; Expression ; Expression ) { Statement }

      break當(dāng) break 語句用于 while 或 for 語句時,導(dǎo)致退出程序循環(huán)。

      continue當(dāng) continue 語句用于 while 或 for 語句時,使程序循環(huán)移動到下一個迭代。

 

awk 命令編程語言中的五種不遵循 C 語言規(guī)則的條件語句是:

      for...in需要以下語法: 

      for ( Variable in Array ) { Statement }

      for...in 語句將 Variable 參數(shù)設(shè)置為 Array 變量的每個索引值,一次一個索引且沒有特定的順序,并用每個迭代來執(zhí)行 

      Statement 參數(shù)指定的操作。請參閱 delete 語句以獲得 for...in 語句的示例。

      if...in需要以下語法: 

      if ( Variable in Array ) { Statement }

      if...in 語句搜索是否存在的 Array 元素。如果找到 Array 元素,就執(zhí)行該語句。

      delete需要以下語法: 

      delete Array [ Expression ]

      delete 語句刪除 Array 參數(shù)指定的數(shù)組元素和 Expression 參數(shù)指定的索引。例如,語句:

for (i in g)

   delete g[i];

      將刪除 g[] 數(shù)組的每個元素。

      exit需要以下語法: 

      exit [Expression]

      exit 語句首先調(diào)用所有 END 操作(以它們發(fā)生的順序),然后以 Expression 參數(shù)指定的出口狀態(tài)終止 awk 命令。如果 exit 

      語句在 END 操作中出現(xiàn),則不調(diào)用后續(xù) END 操作。

      #需要以下語法: 

      # Comment

      # 語句放置注釋。注釋應(yīng)始終以換行字符結(jié)束,但可以在一行上的任何地方開始。

      next停止對當(dāng)前輸入記錄的處理,從下一個輸入記錄繼續(xù)。

 

輸出語句

awk 命令編程語言的兩種輸出語句是:

      print需要以下語法: 

      print [ ExpressionList ] [ Redirection ] [ Expression ]

      print 語句將 ExpressionList 參數(shù)指定的每個表達式的值寫至標(biāo)準(zhǔn)輸出。每個表達式由 OFS 特殊變量的當(dāng)前值隔開,且每個記錄由 

      ORS 特殊變量的當(dāng)前值終止。

      可以使用 Redirection 參數(shù)重定向輸出,此參數(shù)可指定用 >(大于號)、>>(雙大于號)和 

      |(管道)進行的三種輸出重定向。Redirection 參數(shù)如果重定向輸出,而 Expression 參數(shù)是文件的路徑名稱(當(dāng) 

      Redirection 參數(shù)是 > 或 >> 時)或命令的名稱(當(dāng) Redirection 參數(shù)是 | 時)。

      printf需要以下語法: 

      printf Format [ , ExpressionList ] [ Redirection ] [ Expression ]

      printf 語句將 ExpressionList 參數(shù)指定的表達式以 Format 參數(shù)指定的格式寫至標(biāo)準(zhǔn)輸出。除了 c 

      轉(zhuǎn)換規(guī)范(%c)不同外,printf 語句和 printf 命令起完全相同的作用。Redirection 和 Expression 參數(shù)與在 

      print 語句中起相同的作用。

      對于 c 

      轉(zhuǎn)換規(guī)范:如果自變量具有一個數(shù)字值,則編碼是該值的字符將輸出。如果值是零或不是字符集中的任何字符的編碼,則行為未定義。如果自變量不具有數(shù)字值,則輸出字符串值的***個字符;如果字符串不包含任何字符,則行為未定義。

 

  注:如果 Expression 參數(shù)為 Redirection 參數(shù)指定一個路徑名稱,則 Expression 參數(shù)將括在雙引號中以確保將它當(dāng)作字符串對待。

變量

變量可以是標(biāo)量、字段變量、數(shù)組或特殊變量。變量名稱不能以數(shù)字開始。

變量可僅用于引用。除了函數(shù)參數(shù)以外,它們沒有明確說明。未初始化的標(biāo)量變量和數(shù)組元素具有一個為 0(零)的數(shù)字值和一個為空字符串(" ")的字符串值。

根據(jù)上下文,變量呈現(xiàn)出數(shù)字或字符串值。每個變量可以具有數(shù)字值和/或字符串值。例如:

x = "4" + "8"

將值 12 指定給變量 x。對于字符串常量,表達式應(yīng)括在 " "(雙引號)中。

數(shù)字和字符串間沒有顯式轉(zhuǎn)換。要促使將表達式當(dāng)作一個數(shù)字,向它添加 0(零)。要促使將表達式當(dāng)作一個字符串,則添加一個空字符串(" ")。

字段變量

字段變量由 $(美元符號)后跟一個數(shù)字或數(shù)字表達式來表示。記錄中的***個字段指定為 $1 變量,第二個字段指定為 $2,以次類推。$0 

字段變量指定給整個記錄。新字段可以通過指定一個值給它們來創(chuàng)建。將一個值指定給不存在的字段(即任何大于 $NF 

字段變量的當(dāng)前值的字段)將促使創(chuàng)建任何干擾字段(指定為空字符串),增加 NF 特殊變量的值,并促使重新計算 $0 記錄變量。新字段由當(dāng)前字段分隔符(FS 

特殊變量的值)隔開??崭窈吞袷侨笔∽侄畏指舴?。要更改字段分隔符,請使用 -F 標(biāo)志或 在 awk 命令程序中為 FS 特殊變量指定另一個值。

數(shù)組

數(shù)組初始為空且它們大小可動態(tài)更改。數(shù)組由一個變量和在 [ ](方括號)中的下標(biāo)來表示。下標(biāo)或元素標(biāo)識符可以是幾個字符串,它們提供了一種相關(guān)數(shù)組能力。例如,程序:

/red/  { x["red"]++ }

/green/ { y["green"]++ }

增加 red 計數(shù)器和 green 計數(shù)器的計數(shù)。

數(shù)組可以用一個以上的下標(biāo)來建立索引,類似于一些編程語言中的多維數(shù)組。因為 awk 命令的編程數(shù)組實際上一維的,通過串聯(lián)各獨立表達式的字符串值(每個表達式由 

SUBSEP 環(huán)境變量的值隔開)來將以逗號隔開的下標(biāo)轉(zhuǎn)換為單個字符串。所以,以下兩個索引操作是等同的:

x[expr1, expr2,...exprn]

x[expr1SUBSEPexpr2SUBSEP...SUBSEPexprn]

當(dāng)使用 in 運算符時,一個多維 Index 值應(yīng)包含在圓括號之中。除了 in 運算符,任何對不存在數(shù)組元素的引用將自動創(chuàng)建該元素。

特殊變量

以下變量對于 awk 命令具有特殊含義:

      ARGCARGV 數(shù)組中的元素個數(shù)。此值可以更改。

      ARGV其每個成員包含 File 變量之一或 Assignment 變量之一的數(shù)組按序從命令行取出,并從 0(零)編號至 ARGC

      -1。當(dāng)每個輸入文件完成時,ARGV 數(shù)組的下一個成員提供下一個輸入文件的名稱,除非: 

        下一個成員是 Assignment 語句,這種情況下對賦值求值。 

        下一個成員具有空值,這種情況下跳過該成員。程序可以通過設(shè)置 ARGV 數(shù)組的包含該輸入文件的成員設(shè)置為一個空值來跳過所選的輸入文件。 

        下一個成員是 ARGV [ARGC -1] 的當(dāng)前值,awk 命令將此成員解釋為輸入文件的末尾。

 

      CONVFMT將數(shù)字轉(zhuǎn)換為字符串的 printf 格式(除了使用 OFMT 特殊變量的輸出語句)。缺省值為“%.6g”。

      ENVIRON表示運行 awk 命令的環(huán)境的數(shù)組。該數(shù)組的每個元素在以下格式中: 

      ENVIRON [ "Environment VariableName" ] = EnvironmentVariableValue

      當(dāng) awk 命令開始執(zhí)行時設(shè)置這些值,且到執(zhí)行結(jié)束前一直使用該變量,不考慮 ENVIRON 特殊變量的任何修改。

      FILENAME當(dāng)前輸入文件的路徑名稱。在執(zhí)行 BEGIN 操作的過程中,F(xiàn)ILENAME 的值未定義。在執(zhí)行 END 

      操作的過程中,該值是處理的***一個輸入文件的名稱。

      FNR當(dāng)前文件中的當(dāng)前輸入記錄的個數(shù)。

      FS輸入字段分隔符。缺省值是空格。如果輸入字段分隔符是空格,則任何數(shù)目的語言環(huán)境定義的空格可以分隔字段。FS 特殊變量可以有兩種附加的值: 

        如果 FS 設(shè)置為單個字符,則字段由該字符的每個單個具體值隔開。 

        如果 FS 位置為一個擴展正則表達式,則字段由與擴展正則表達式匹配的每個序列的具體值隔開。

 

      NF當(dāng)前記錄中的字段個數(shù),***數(shù) 99 個。在 BEGIN 操作中,除非先前發(fā)出不帶 Variable 參數(shù)的 getline 函數(shù),否則 NF 

      特殊變量未定義。在 END 操作中,除非在輸入 END 操作之前發(fā)出不帶 Variable 參數(shù)的后續(xù)的、重定向的 getline 函數(shù),否則 NF 

      特殊變量保留它為讀取的***一個記錄而具有的值。

      NR當(dāng)前輸入記錄的個數(shù)。在 BEGIN 操作中,NR 特殊變量的值是 0(零)。在 END 操作中,值是***處理的記錄的編號。

      OFMT在輸出語句中將數(shù)字轉(zhuǎn)換為字符串的 printf 格式。缺省值為“%.6g”。

      OFS輸出字段分隔符(缺省值是空格)。

      ORS輸出記錄分隔符(缺省值是換行字符)。

      RLENGTH由 match 函數(shù)來匹配的字符串的長度。

      RS輸入記錄分隔符(缺省值是換行字符)。如果 RS 

      特殊變量為空,則記錄以一個或多個空行的序列隔開;***個空行或***一個空行在輸入的開始和結(jié)束都不會產(chǎn)生空記錄;換行字符始終是一個字段分隔符,不考慮 

      FS 特殊變量的值。

      RSTART由 match 函數(shù)來匹配的字符串的起始位置,從 1 開始編號。等同于 match 函數(shù)的返回值。

      SUBSEP隔開多個下標(biāo)。缺省值是 \031。

 

標(biāo)志

      -f ProgramFile從 ProgramFile 變量指定的文件獲取 awk 命令的指令。如果多次指定 -f 

      標(biāo)志,則文件的串聯(lián)(按指定的順序)將用作指令集。

      -F Ere請使用 Ere 變量指定的擴展正則表達式作為字段分隔符。缺省字段分隔符是空格。

      -v Assignment將值指定給 awk 命令編程語言的變量。Assignment 參數(shù)的格式是 Name = Value。Name 

      部分指定變量的名稱并可以是任何下劃線、數(shù)字或字母字符的組合,但它必須以字母字符或下劃線開頭。Value 

      部分也由下劃線、數(shù)字和字母數(shù)字組成,且前面和后面都有一個 "(雙引號字符,類似于字符串值)。如果 Value 部分是數(shù)字,則也將為變量指定數(shù)字值。 

      -v 標(biāo)志指定的賦值在執(zhí)行 awk 命令程序的任何部分之前發(fā)生,包含 BEGIN 節(jié)。

      Assignment將值指定給 awk 命令編程語言的變量。該值和帶有 -v 標(biāo)志的 Assignment 

      變量具有相同的格式和功能(除了兩者處理的時間不同以外)。Assignment 參數(shù)在處于命令行時跟在其后的輸入文件(由 File 

      變量指定)之前處理。如果指定 Assignment 參數(shù)僅優(yōu)先于多個輸入文件的***個,則賦值在 BEGIN 節(jié)后(如果有)就處理。如果 

      Assignment 參數(shù)出現(xiàn)在***一個文件后,則在 END 節(jié)(如果有)之前處理賦值。如果不指定輸入文件,則當(dāng)讀取了標(biāo)準(zhǔn)輸入時處理賦值。

      File指定包含要處理的輸入的文件的名稱。如果不指定 File 變量,或指定了 -(減號),則處理標(biāo)準(zhǔn)輸入。

      'Program'包含 awk 命令的指令。如果不指定 -f 標(biāo)志,Program 變量應(yīng)該是命令行上的***個項。它應(yīng)括在 ' '(單引號)中。

 

出口狀態(tài)

該命令返回以下出口值:

      0成功完成。

      >0發(fā)生錯誤。

 

可以通過使用 exit [ Expression ] 條件語句來更改程序中的出口狀態(tài)。

示例

  要顯示長于 72 個字符的文件的行,請輸入: 

awk  'length  >72'  chapter1

  這選擇 chapter1 文件中長于 72 個字符的每一行,并將這些行寫至標(biāo)準(zhǔn)輸出,因為未指定 Action。制表符以 1 個字符計數(shù)。

  要顯示字 start 和 stop 之間的所有行,包含“start”和“stop”,請輸入: 

awk  '/start/,/stop/'  chapter1

  要運行一個處理文件 chapter1 的 awk 命令程序 sum2.awk,請輸入: 

awk  -f  sum2.awk  chapter1

  以下程序,sum2.awk,計算了輸入文件 chapter1 中的第二列的數(shù)字的總和與平均值:

    {

       sum += $2

    }

END {

       print "Sum: ", sum;

       print "Average:", sum/NR;

    }

  ***個操作將每行的第二個字段的值添加至變量 sum。當(dāng)***次被引用時,所有的變量都初始化為數(shù)字值 0(零)。第二個操作前的模式 END 

  使那些操作在讀取了所有輸入文件之后才執(zhí)行。用于計算平均值的 NR 特殊變量是一個指定已經(jīng)讀取的記錄的個數(shù)的特殊變量。

  要以相反順序打印前兩個字段,請輸入: 

awk '{ print $2, $1 }' chapter1

  以下 awk 的程序 sum3.awk 打印文件 chapter2 

  的前兩個字段(輸入字段由逗號和/或空格和跳格隔開),然后合計***列的數(shù)字,并打印出總和與平均值: 

BEGIN  {FS = ",|[ \t]+"}

       {print $1, $2}

       {s += $1}

END    {print "sum is",s,"average is", s/NR }      

#p#

 

NAME

       awk - pattern-directed scanning and processing language


SYNOPSIS

       awk [ -F fs ] [ -v var=value ] [ 'prog' | -f progfile ] [ file ...  ]


DESCRIPTION

       Awk scans each input file for lines that match any of a set of patterns
       specified literally in prog or in one or more  files  specified  as  -f
       progfile.   With  each  pattern  there can be an associated action that
       will be performed when a line of a file matches the pattern.  Each line
       is  matched  against the pattern portion of every pattern-action state-
       ment; the associated action is performed for each matched pattern.  The
       file  name  - means the standard input.  Any file of the form var=value
       is treated as an assignment, not a filename, and  is  executed  at  the
       time  it  would  have been opened if it were a filename.  The option -v
       followed by var=value is an assignment to be done before prog  is  exe-
       cuted;  any  number  of  -v  options  may be present.  The -F fs option
       defines the input field separator to be the regular expression fs.

       An input line is normally made up of fields separated by  white  space,
       or by regular expression FS.  The fields are denoted $1, $2, ..., while
       $0 refers to the entire line.  If FS is null, the input line  is  split
       into one field per character.

       A pattern-action statement has the form

              pattern { action }

       A  missing  {  action  } means print the line; a missing pattern always
       matches.  Pattern-action statements are separated by newlines or  semi-
       colons.

       An  action  is a sequence of statements.  A statement can be one of the
       following:

              if( expression ) statement [ else statement ]
              while( expression ) statement
              for( expression ; expression ; expression ) statement
              for( var in array ) statement
              do statement while( expression )
              break
              continue
              { [ statement ... ] }
              expression              # commonly var = expression
              print [ expression-list ] [ > expression ]
              printf format [ , expression-list ] [ > expression ]
              return [ expression ]
              next                    # skip remaining patterns on this input line
              nextfile                # skip rest of this file, open next, start at top
              delete array[ expression ]# delete an array element
              delete array            # delete all elements of array
              exit [ expression ]     # exit immediately; status is expression

       Statements are terminated by semicolons, newlines or right braces.   An
       empty  expression-list stands for $0.  String constants are quoted " ",
       with the usual C escapes recognized within.  Expressions take on string
       or numeric values as appropriate, and are built using the operators + -
       * / % ^ (exponentiation), and concatenation (indicated by white space).
       The  operators  !  ++  -- += -= *= /= %= ^= > >= < <= == != ?: are also
       available in expressions.  Variables may  be  scalars,  array  elements
       (denoted  x[i])  or  fields.   Variables  are  initialized  to the null
       string.  Array subscripts may be any string, not  necessarily  numeric;
       this allows for a form of associative memory.  Multiple subscripts such
       as [i,j,k] are permitted; the constituents are concatenated,  separated
       by the value of SUBSEP.

       The  print statement prints its arguments on the standard output (or on
       a file if >file or >>file is present or on a pipe if |cmd is  present),
       separated  by the current output field separator, and terminated by the
       output record separator.  file and cmd may be literal names  or  paren-
       thesized  expressions;  identical string values in different statements
       denote the same open file.  The printf statement formats its expression
       list  according  to  the format (see printf(3)).  The built-in function
       close(expr) closes the  file  or  pipe  expr.   The  built-in  function
       fflush(expr) flushes any buffered output for the file or pipe expr.

       The  mathematical  functions  exp,  log,  sqrt, sin, cos, and atan2 are
       built in.  Other built-in functions:

       length the length of its argument taken as a string, or  of  $0  if  no
              argument.

       rand   random number on (0,1)

       srand  sets seed for rand and returns the previous seed.

       int    truncates to an integer value

       substr(s, m, n)
              the n-character substring of s that begins at position m counted
              from 1.

       index(s, t)
              the position in s where the string t occurs, or  0  if  it  does
              not.

       match(s, r)
              the position in s where the regular expression r occurs, or 0 if
              it does not.  The variables RSTART and RLENGTH are  set  to  the
              position and length of the matched string.

       split(s, a, fs)
              splits  the  string s into array elements a[1], a[2], ..., a[n],
              and returns n.  The separation is done with the regular  expres-
              sion  fs  or with the field separator FS if fs is not given.  An
              empty string as field separator splits the string into one array
              element per character.

       sub(r, t, s)
              substitutes t for the first occurrence of the regular expression
              r in the string s.  If s is not given, $0 is used.

       gsub   same as sub except that all occurrences of the  regular  expres-
              sion  are  replaced;  sub and gsub return the number of replace-
              ments.

       sprintf(fmt, expr, ... )
              the string resulting from formatting expr ...  according to  the
              printf(3) format fmt

       system(cmd)
              executes cmd and returns its exit status

       tolower(str)
              returns  a copy of str with all upper-case characters translated
              to their corresponding lower-case equivalents.

       toupper(str)
              returns a copy of str with all lower-case characters  translated
              to their corresponding upper-case equivalents.

       The ``function'' getline sets $0 to the next input record from the cur-
       rent input file; getline <file sets $0 to the next  record  from  file.
       getline  x  sets  variable x instead.  Finally, cmd | getline pipes the
       output of cmd into getline; each call of getline returns the next  line
       of  output  from cmd.  In all cases, getline returns 1 for a successful
       input, 0 for end of file, and -1 for an error.

       Patterns are arbitrary Boolean combinations (with ! || &&)  of  regular
       expressions  and  relational  expressions.   Regular expressions are as
       defined in re_format(7).  Isolated regular  expressions  in  a  pattern
       apply  to the entire line.  Regular expressions may also occur in rela-
       tional expressions, using the operators ~ and !~.  /re/ is  a  constant
       regular  expression; any string (constant or variable) may be used as a
       regular expression, except in  the  position  of  an  isolated  regular
       expression in a pattern.

       A  pattern  may  consist  of two patterns separated by a comma; in this
       case, the action is performed for all lines from an occurrence  of  the
       first pattern though an occurrence of the second.

       A relational expression is one of the following:

              expression matchop regular-expression
              expression relop expression
              expression in array-name
              (expr,expr,...) in array-name

       where  a  relop  is  any  of  the  six relational operators in C, and a
       matchop is either ~ (matches) or !~ (does not match).  A conditional is
       an  arithmetic expression, a relational expression, or a Boolean combi-
       nation of these.

       The special patterns BEGIN and END  may  be  used  to  capture  control
       before  the first input line is read and after the last.  BEGIN and END
       do not combine with other patterns.

       Variable names with special meanings:

       CONVFMT
              conversion format used when converting numbers (default %.6g)

       FS     regular expression used to separate  fields;  also  settable  by
              option -Ffs.

       NF     number of fields in the current record

       NR     ordinal number of the current record

       FNR    ordinal number of the current record in the current file

       FILENAME
              the name of the current input file

       RS     input record separator (default newline)

       OFS    output field separator (default blank)

       ORS    output record separator (default newline)

       OFMT   output format for numbers (default %.6g)

       SUBSEP separates multiple subscripts (default 034)

       ARGC   argument count, assignable

       ARGV   argument  array, assignable; non-null members are taken as file-
              names

       ENVIRON
              array of environment variables; subscripts are names.

       Functions may be defined (at the position of  a  pattern-action  state-
       ment) thus:

              function foo(a, b, c) { ...; return x }

       Parameters  are  passed  by  value  if scalar and by reference if array
       name; functions may be called recursively.  Parameters are local to the
       function;  all other variables are global.  Thus local variables may be
       created by providing excess parameters in the function definition.


EXAMPLES

       length($0) > 72
              Print lines longer than 72 characters.

       { print $2, $1 }
              Print first two fields in opposite order.

       BEGIN { FS = ",[ \t]*|[ \t]+" }
             { print $2, $1 }
              Same, with input fields separated by  comma  and/or  blanks  and
              tabs.

            { s += $1 }
       END  { print "sum is", s, " average is", s/NR }
              Add up first column, print sum and average.

       /start/, /stop/
              Print all lines between start/stop pairs.

       BEGIN     {    # Simulate echo(1)
            for (i = 1; i < ARGC; i++) printf "%s ", ARGV[i]
            printf "\n"
            exit }


SEE ALSO

       lex(1), sed(1)
       A.  V. Aho, B. W. Kernighan, P. J. Weinberger, The AWK Programming Lan-
       guage, Addison-Wesley, 1988.  ISBN 0-201-07981-X


BUGS

       There are no explicit conversions  between  numbers  and  strings.   To
       force  an expression to be treated as a number add 0 to it; to force it
       to be treated as a string concatenate "" to it.
       The scope rules for variables in functions are a botch; the  syntax  is
       worse.



                                                                        awk(1)

 

責(zé)任編輯:yangsai 來源: centos.99k.org
相關(guān)推薦

2011-08-24 16:48:36

man中文man

2011-08-15 10:21:09

man中文man

2011-08-11 16:11:49

at中文man

2011-08-25 10:21:56

man.conf中文man

2011-08-15 15:02:31

usleep中文man

2011-09-23 13:59:40

find中文man

2011-08-12 09:17:57

deallocvt中文man

2011-08-25 17:24:54

puts中文man

2011-07-15 16:58:36

ac中文man

2011-08-11 18:32:21

cp中文man

2011-08-23 11:34:26

ipcs中文man

2011-08-25 10:16:02

lmhosts中文man

2011-08-24 15:29:06

grant中文man

2011-08-25 17:32:40

setbuffer中文man

2011-08-25 16:50:08

getc中文man

2011-08-25 16:52:54

getchar中文man

2011-08-25 17:03:51

pclose中文man

2011-08-25 16:22:29

fputc中文man

2011-08-25 16:28:50

fread中文man

2011-08-25 17:27:58

rewind中文man
點贊
收藏

51CTO技術(shù)棧公眾號