AWK
本參考手冊面向有一定 UNIX 使用經驗的使用者,他們可能剛剛遇到問題,並被建議使用 awk 來解決。有關 awk 的更多資訊,請參見 An Awk Primer。
以下是主要的 awk 版本:
- awk 或 Bell Labs awk
- nawk 或 new awk
- gawk (GNU awk)
- mawk
nawk 和 gawk 都可以執行 awk 程式,無需修改。
獲取 AWK:如果您使用的是 Linux 或 macOS,那麼您已經擁有 AWK。對於 MS Windows,可以在 ezwinports、GnuWin32 專案 和 Cygwin 中找到 GNU awk 的版本。
Awk 從檔案或標準輸入讀取資料,並將結果輸出到標準輸出。您通常希望將結果重定向到檔案,但這些示例中沒有這樣做,因為這樣會佔用空間。awk 不適用於非文字檔案,例如可執行檔案和 FrameMaker 檔案。如果您需要編輯這些檔案,請使用二進位制編輯器,例如 emacs 中的 hexl-mode。
學習 awk 令人沮喪的一點是,要讓您的程式透過 shell 的解析器。正確的方法是在程式周圍使用單引號,如下所示
>awk '{print $0}' filename
單引號保護幾乎所有內容免受 shell 的影響。在 csh 或 tcsh 中,您仍然需要注意感嘆號,但除此之外,您是安全的。
學習 awk 令人沮喪的另一點是可愛的錯誤資訊
awk '{print $0,}' filename
awk: syntax error near line 1
awk: illegal statement near line 1
gawk 通常有更好的錯誤資訊。至少它會告訴你哪裡出錯了
gawk '{print $0,}' filename
gawk: cmd. line:1: {print $0,}
gawk: cmd. line:1: ^ parse error
因此,如果您在獲取 awk 語法方面遇到問題,請暫時切換到 gawk。
- Awk 識別“檔案”、“記錄”和“欄位”的概念。
- 檔案由記錄組成,預設情況下,記錄是檔案的行。一行成為一條記錄。
- Awk 一次處理一條記錄。
- 記錄由欄位組成,預設情況下,欄位由任意數量的空格或製表符分隔。
- 欄位 1 使用 $1 訪問,欄位 2 使用 $2 訪問,依此類推。$0 指的是整個記錄。
學習 awk 的最快方法可能是檢視一些示例程式。上面的示例程式將列印整個檔案,就像 cat(1) 一樣。以下是一些其他示例,以及對它們功能的簡要說明。
>awk '{print $2,$1}' filename
將列印第二個欄位,然後是第一個欄位。所有其他欄位將被忽略。
>awk '{print $1,$2,sin($3/$2)}' filename
將列印第一個和第二個欄位,然後是第三個欄位除以第二個欄位的正弦值。因此,第二個和第三個欄位最好是數字。Awk 有其他內建的數學函式,例如正弦;閱讀手冊頁以檢視哪些函式可用。
- "我仍然經常說 awk '{print $1}'."
- PERL 的發明者 Larry Wall (lwall@netlabs.com)
如果您不想將程式應用於檔案的每一行,該怎麼辦?例如,您可能只想處理第一個欄位大於第二個欄位的行。以下程式可以做到這一點
>awk '$1 > $2 {print $1,$2,$1-$2}' filename
花括號之外的部分稱為“模式”,花括號內部的部分稱為“動作”。比較運算子包括來自 C 的運算子
== != < > <= >= ?:
如果沒有給出模式,則動作將應用於所有行。上面示例程式中使用了此事實。如果沒有給出動作,則將列印整行。如果“print”單獨使用,則將列印整行。因此,以下幾種方法是等效的
awk '$1 > $2' filename
awk '$1 > $2{print}' filename
awk '$1 > $2{print $0}' filename
一行中的各個欄位也可以被視為字串而不是數字。要將欄位與字串進行比較,請使用以下方法
> awk '$1=="foo"{print $2}' filename
如果您想要包含特定字串的行,只需在模式中新增一個 正則表示式(與 egrep(1) 類似),如下所示
>awk '/foo.*bar/{print $1,$3}' filename
這將列印包含單詞“foo”的所有行,然後列印包含單詞“bar”的所有行。如果您只想列印第二個欄位中包含“foo”的行,請使用 ~(“包含”)運算子
>awk '$2~/foo/{print $3,$1}' filename
如果您想要列印第二個欄位中不包含“foo”的行,請使用否定 ~ 運算子,!~
>awk '$2!~/foo/{print $3,$1}' filename
這個運算子可以理解為“不包含”。
您可以使用來自 C 的布林運算子建立複雜的模式,這些運算子包括!用於“非”,&& 用於“與”,|| 用於“或”。可以使用括號進行分組。
模式有三種特殊形式,它們不符合上述描述。其中之一是正則表示式的起始-結束對。例如,要列印包含“foo”和“bar”的所有行,包括它們本身,可以使用以下程式碼
>awk '/foo/,/bar/' filename
另外兩種特殊形式與此類似;它們是 BEGIN 和 END 模式。與 BEGIN 模式關聯的任何動作將在執行任何逐行處理之前發生。與 END 模式關聯的動作將在處理完所有行後發生。
但是,如何將多個模式-動作對放入一個 awk 程式中?有多種選擇。其中之一是將它們合併在一起,如下所示
> awk 'BEGIN{print"fee"} $1=="foo"{print"fi"}
END{print"fo fum"}' filename
另一種選擇是將程式放入一個檔案中,如下所示
BEGIN{print"fee"}
$1=="foo"{print"fi"}
END{print"fo fum"}
假設該檔名為 giant.awk。現在,使用 awk 的“-f”標誌執行它
> awk -f giant.awk filename
第三種選擇是建立一個呼叫 awk 的檔案。以下形式可以做到這一點
#!/usr/bin/awk -f
BEGIN{print"fee"}
$1=="foo"{print"fi"}
END{print"fo fum"}
如果我們呼叫此檔案 giant2.awk,我們可以透過首先授予它執行許可權來執行它,
> chmod u+x giant2.awk
然後像這樣呼叫它
> ./giant2.awk filename
awk 有變數,這些變數可以是實數或字串。例如,以下程式碼列印第五列的執行總計
> awk '{print x+=$5,$0 }' filename
這在檢視“ls -l”中的檔案大小時很有用。在核對賬單時,如果支票金額保留在一列中,它也很有用。
awk 變數在第一次使用時被初始化為零或空字串。當然,具體情況取決於它們的使用方式。
變數對於儲存中間值也很有用。此示例還介紹了使用分號來分隔語句
> awk '{d=($2-($1-4));s=($2+$1);print d/sqrt(s),d*d/s }' filename
請注意,最後一個語句(在本例中是“print”)不需要分號。儘管如此,加入分號也不會造成傷害。
- 整數變數可以用來引用欄位。如果一個欄位包含有關哪個其他欄位重要的資訊,此指令碼將只打印重要的欄位
> awk '{imp=$1; print $imp }' filename
- 特殊變數 NF 會告訴您這條記錄中有多少個欄位。此指令碼列印每條記錄的第一個和最後一個欄位,無論有多少個欄位
> awk '{print $1, $NF}' filename
- 特殊變數 NR 會告訴您這是第幾條記錄。每讀取一條新記錄,它都會遞增一次。這提供了一種簡單的方法為檔案新增行號
> awk '{print NR, $0}' filename
當然,還有無數其他方法可以使用各種 UNIX 工具為檔案新增行號。這留作練習,供讀者自行完成。
- 特殊變數 FS(欄位分隔符)決定了 awk 如何將每條記錄分割成欄位。此變數可以在命令列中設定。例如,/etc/passwd 的欄位用冒號分隔。
> awk -F: '{print $1,$3 }' /etc/passwd
- 此變數實際上可以設定為任何正則表示式,與 egrep(1) 類似。
各個欄位也是變數,您可以將內容賦給它們。如果您想刪除每行中的第 10 個欄位,您可以透過使用 for 迴圈列印欄位 1 到 9,然後從 11 開始列印(見下文)來實現。但這將非常輕鬆地完成。
> awk '{$10=""; print }' filename
在很多方面,awk 類似於 C。它包含所有 "for"、"while"、"do-while" 和 "if" 結構。語句可以用大括號分組。此指令碼將在自己的行上列印每個記錄的每個欄位。
> awk '{for(i=1;i<=NF;i++) print $i }' filename
如果您想生成比 "print" 語句提供的格式更好格式的格式,您可以像在 C 中一樣使用 "printf"。以下是一個示例,它將第一個欄位視為字串,然後進行一些數字操作。
> awk '{printf("%s %03d %02d %.15g\n",$1,$2,$3,$3/$2); }' filename
使用 printf,您需要顯式的換行符。
我們可以使用 "printf" 列印不帶換行符的內容,這對於以每行一個記錄的順序反向列印記錄欄位很有用。
> awk '{for(i=NF;i > 0;i--) printf("%s",$i); printf("\n"); }' filename
awk 有關聯陣列,由字串索引。它沒有 C 語言陣列的直接類似物。字串索引的關聯陣列本身很有用,但讓它們像普通陣列一樣工作很麻煩。
例如,我們可以統計文件中單詞的頻率(忽略列印它們的令人討厭的部分)。
> awk '{for(i=1;i <=NF;i++) freq[$i]++ }' filename
該陣列將為檔案中出現的每個單詞儲存一個整數值。不幸的是,這將把 "foo"、"Foo" 和 "foo," 視為不同的單詞。好吧。我們如何打印出這些頻率?awk 有一個特殊的 "for" 結構,用於遍歷陣列中的值。此指令碼比大多數命令列都長,因此它將表示為可執行指令碼。
#!/usr/bin/awk -f
{for(i=1;i <=NF;i++) freq[$i]++ }
END{for(word in freq) print word, freq[word] }
此遍歷陣列的迴圈似乎沒有特定的順序。因此,來自此類程式的輸出通常必須透過 sort(1) 進行管道傳輸才能有用。
多維陣列以一種奇怪的方式實現。給定的索引將一起連線(使用一個特殊的分隔符)以獲得一個字串,並將其用作索引。此程式將列印單詞對的頻率。
#!/usr/bin/awk -f
{for(i=1;i < NF;i++) freq[$i,$(i+1)]++ }
END{for(words in freq) print words, freq[words] }
不幸的是,這將打印出分隔符,該分隔符預設情況下不是常用字元。您可以透過使用 nawk 或 gawk 將像空格這樣的邏輯內容分配給變數 SUBSEP 來更改此問題(在普通 awk 中不允許這樣做)。
#!/usr/bin/awk -f
BEGIN{SUBSEP=""}
{for(i=1;i < NF;i++) freq[$i,$(i+1)]++}
END{for(words in freq) print words, freq[words] }
不幸的是,這不能讓您單獨引用索引。這裡的秘訣是使用 "split" 函式,它將字串分解成一個數組。
#!/usr/bin/awk -f
BEGIN{SUBSEP="" }
{for(i=1;i < NF;i++) freq[$i,$(i+1)]++}
END{ for(words in freq)
{
split(words,word,SUBSEP);
print word[1], freq[words],word[2];
}
}
連結
- 8 Arrays in awk in The GNU Awk User’s Guide, gnu.org
普通的 awk 沒有內建函式來排序陣列。但是,gawk 有 *asort*(按值排序)和 *asorti*(按索引(也稱為鍵)排序)函式。asort 會丟失原始索引,用 1 到 length 索引替換它們。
連結
- 12.2.2 Sorting Array Values and Indices with gawk in The GNU Awk User’s Guide, gnu.org
當您在檔案中使用 awk 指令碼時,可以將程式分成多行,以使其更易於閱讀。註釋以與 sh 程式設計相同的方式開頭,使用 #。
#!/usr/bin/awk -f
# this program prints the frequencies of word pairs
BEGIN{SUBSEP=""} # set the index separator
# to a nice character
{for(i=1;i < NF;i++) freq[$i,$(i+1)]++}
END{ for(words in freq)
{
# just to show we can put a comment in here.
split(words,word,SUBSEP); # or here
print word[1], freq[words],word[2];
}
}
您可以使用 awk 建立文字,以及處理現有文字。它對於快速生成函式值表非常有用,無需編譯 C 程式。例如,它可以顯示 sin(x)/x 隨著 x 接近零而接近 1。
> awk '{x=1.0/NR; print x,sin(x)/x;}'
每次讀取新行時都會列印一個新值。因此,您可以按回車鍵,直到獲得所需的所有值。或者,如果您需要一定數量的值,您可以執行以下操作:
> awk 'BEGIN{for(i=1;i <=30;i++){x=1.0/i;print x,sin(x)/x;}}' /dev/null
其中 30 是設定值的數量。
- {} : 用於操作周圍,以及在操作中分組語句。
- $ : 表示欄位。$1 是第一個欄位,$0 是整個記錄。
- ~ : "包含" 運算子。 "foobar"~"foo" 為真。僅限字串。
- !~ : "不包含" 運算子。僅限字串。
- == : 等於運算子。適用於數字或字串。
- < > <= >= != : 不等式運算子。適用於數字或字串。
- # : 註釋開始字元。
- , : 在 "print" 或 "printf" 語句中分隔專案。
- ; : 分隔語句。
- // : 用於正則表示式周圍。
- && : 布林與。
- || : 布林或。
- ! : 布林非。
- () : 用於對布林表示式進行分組,向函式傳遞引數,以及在 "for"、"while" 等等的條件周圍。
Awk 可用於生成不想手工輸入的 C 程式碼。例如,此指令碼將生成顯式 3x3 矩陣乘法例程。
gawk 'BEGIN{
for(i=0;i<3;i++)
for(j=0;j<3;j++){
printf("d[%d][%d]=",i,j);
for(k=0;k<3;k++){
printf("l[%d][%d]*r[%d][%d]%s",
i,k,k,j,(k<2)?"+":";\n");
}
}
}'
現在來看一個大型示例。
# This awk program collects statistics on two
# "random variables" and the relationships
# between them. It looks only at fields 1 and
# 2 by default Define the variables F and G
# on the command line to force it to look at
# different fields. For example:
# awk -f stat_2o1.awk F=2 G=3 stuff.dat \
# F=3 G=5 otherstuff.dat
# or, from standard input:
# awk -f stat_2o1.awk F=1 G=3
# It ignores blank lines, lines where either
# one of the requested fields is empty, and
# lines whose first field contains a number
# sign. It requires only one pass through the
# data. This script works with vanilla awk
# under SunOS 4.1.3.
BEGIN{
F=1;
G=2;
}
length($F) > 0 && \
length($G) > 0 && \
$1 !~/^#/ {
sx1+= $F; sx2 += $F*$F;
sy1+= $G; sy2 += $G*$G;
sxy1+= $F*$G;
if( N==0 ) xmax = xmin = $F;
if( xmin > $F ) xmin=$F;
if( xmax < $F ) xmax=$F;
if( N==0 ) ymax = ymin = $G;
if( ymin > $G ) ymin=$G;
if( ymax < $G ) ymax=$G;
N++;
}
END {
printf("%d # N\n" ,N );
if (N <= 1)
{
printf("What's the point?\n");
exit 1;
}
printf("%g # xmin\n",xmin);
printf("%g # xmax\n",xmax);
printf("%g # xmean\n",xmean=sx1/N);
xSigma = sx2 - 2 * xmean * sx1+ N*xmean*xmean;
printf("%g # xvar\n" ,xvar =xSigma/ N );
printf("%g # xvar unbiased\n",xvaru=xSigma/(N-1));
printf("%g # xstddev\n" ,sqrt(xvar ));
printf("%g # xstddev unbiased\n",sqrt(xvaru));
printf("%g # ymin\n",ymin);
printf("%g # ymax\n",ymax);
printf("%g # ymean\n",ymean=sy1/N);
ySigma = sy2 - 2 * ymean * sy1+ N*ymean*ymean;
printf("%g # yvar\n" ,yvar =ySigma/ N );
printf("%g # yvar unbiased\n",yvaru=ySigma/(N-1));
printf("%g # ystddev\n" ,sqrt(yvar ));
printf("%g # ystddev unbiased\n",sqrt(yvaru));
if ( xSigma * ySigma <= 0 )
r=0;
else
r=(sxy1 - xmean*sy1- ymean * sx1+ N * xmean * ymean)
/sqrt(xSigma * ySigma);
printf("%g # correlation coefficient\n", r);
if( r > 1 || r < -1 )
printf("SERIOUS ERROR! CORRELATION COEFFICIENT");
printf(" OUTSIDE RANGE -1..1\n");
if( 1-r*r != 0 )
printf("%g # Student's T (use with N-2 degfreed)\n&", \
t=r*sqrt((N-2)/(1-r*r)) );
else
printf("0 # Correlation is perfect,");
printf(" Student's T is plus infinity\n");
b = (sxy1 - ymean * sx1)/(sx2 - xmean * sx1);
a = ymean - b * xmean;
ss=sy2 - 2*a*sy1- 2*b*sxy1 + N*a*a + 2*a*b*sx1+ b*b*sx2 ;
ss/= N-2;
printf("%g # a = y-intercept\n", a);
printf("%g # b = slope\n" , b);
printf("%g # s^2 = unbiased estimator for sigsq\n",ss);
printf("%g + %g * x # equation ready for cut-and-paste\n",a,b);
ra = sqrt(ss * sx2 / (N * xSigma));
rb = sqrt(ss / ( xSigma));
printf("%g # radius of confidence interval ");
printf("for a, multiply by t\n",ra);
printf("%g # radius of confidence interval ");
printf("for b, multiply by t\n",rb);
}
此文件最初由 Andrew M. Ross 編寫。它可以在這裡找到 here 並且由哈維穆德學院計算機科學系根據 GFDL 釋出。
awk 的命令列選項(也稱為開關)。
- -F field-separator: 使用欄位分隔符正則表示式來分隔欄位。
- -f source-file
- -v var=val: 將變數設定為該值。由 POSIX 定義;在原始 awk 中不存在。
GNU awk 的命令列選項(也稱為開關),超出基本 awk。
- -W gawk-opt
- ...
- --posix
- ...
連結
- 2.2 Command-Line Options in The GNU Awk User's Guide, gnu.org
- Unix awk(1) manual page at man.cat-v.org
支援常用的運算子 +、-、*、/、 %、^;gawk 支援 **,但 POSIX awk 不支援。內建數學函式包括 exp、log、sqrt、sin、cos、atan2、rand、srand 和 int。
數字字面量為十進位制;在 C 語言風格中,它們可以使用 gawk 中的 GNU 擴充套件來表示十六進位制和八進位制。
連結
- 6.2.1 Arithmetic Operators in The GNU Awk User’s Guide, gnu.org
- 9.1.2 Numeric Functions in The GNU Awk User’s Guide, gnu.org
使用者定義的函式可以按如下方式定義。
- function plus(x,y) { return x+y }
一些 awk 實現(包括 gawk)允許使用 "func" 代替 "function",但這不符合 POSIX 標準。
支援遞迴。
- awk 'function fact(x) { if (x > 1) { return x*fact(x-1) } else return 1} BEGIN{print fact(4)}'
連結
- 9.2 User-Defined Functions in The GNU Awk User’s Guide, gnu.org
- User-Defined Functions in awk, opengroup.org
傳統的 awk 沒有提供位操作的位運算子。但是,gawk 內建了位操作函式,包括 and()、or()、xor()、compl()、lshift() 和 rshift()。
連結
- GNU Awk 使用者指南中的位操作函式,gnu.org
傳統的 awk 沒有辦法在 awk 程式中包含或匯入函式庫;最接近的方法是多次使用 -f 選項。相比之下,gawk 提供了這種可能性作為 GNU 擴充套件,使用 @include 關鍵字。
只要庫檔案所在的目錄在 AWKPATH 環境變數中,就不需要指定庫檔案的完整路徑。設定 AWKPATH 會阻止 awk 將當前目錄視為路徑的一部分,除非 AWKPATH 包含句點 (.) 來表示當前目錄。AWKPATH 的專案分隔符是冒號 (:),或者在 Windows 上是分號 (;)。
也可以透過 gawk 的 -i 選項載入 awk 函式庫。因此,如果您有檔案 lib.awk,該檔案目錄的路徑在 AWKPATH 中,並且該檔案定義了 abs 函式,您可以像這樣呼叫 gawk
- awk -ilib "BEGIN {print abs(-4)}"
您無法使用 -f 選項執行此操作;您必須將主程式儲存在單獨的檔案中,然後在同一命令列上兩次使用 -f 選項,第一次載入庫,第二次載入主程式。
可以在 Github 上的 Many AWK 專案中找到許可證寬鬆的 awk 庫。
連結
- 2.7 將其他檔案包含到您的程式中,GNU Awk 使用者指南,gnu.org
- 2.5.1 AWKPATH 環境變數,GNU Awk 使用者指南,gnu.org
- 2.2 命令列選項,GNU Awk 使用者指南,gnu.org
- 10 awk 函式庫,GNU Awk 使用者指南,gnu.org
- Many AWK - awk 函式庫 (MIT 許可證),github.com
- awk-libs - awk 函式庫,github.com
awk 使用的單行示例
- echo abcd |awk '/b.*d/'
- 輸出與正則表示式匹配的行,類似於 grep 命令。
- echo abcd |awk '/b.*d/ {print $0}'
- 與上面相同,使用顯式 print 語句。$0 代表整行。
- echo ab cd |awk '/b.*d/ {print $2}'
- 對於與正則表示式匹配的行,輸出第二個欄位。預設情況下,使用一系列空格作為欄位分隔符。因此,輸出 "cd"。
- echo abcd,e |awk -F, '/b.*d/ {print $2}'
- 對於與正則表示式匹配的行,輸出第二個欄位,由於 -F 選項,使用逗號作為欄位分隔符。因此,輸出 "e"。
- echo abcd,e |awk '{print toupper($0)}'
- 輸出所有大寫字母的行。對於小寫字母,使用 "tolower"。
- echo a b c d | awk '{print $NF, $(NF-1)}'
- 輸出最後一個欄位和倒數第二個欄位;NF 是欄位數。
- echo ab cd | awk 'NF>=2'
- 輸出欄位數為 2 或更多的行。
- echo ab cd | awk '{print NF}'
- 對於每一行,輸出其中的欄位數。
- echo ab cd | awk 'length($2) > 1'
- 輸出所有第二欄位長度大於 1 的行。
- echo ab cd | awk '$2 ~ /cd/'
- 輸出第二欄位與正則表示式匹配的所有行。
- echo ab cd | awk '$1 ~ /ab/ && $2 ~ /cd/'
- 與上面類似,但有兩個子條件用 "&&" 連線。支援從 C 程式語言中知道的其他一些邏輯運算子。
- cat file.txt | awk 'NR >= 100 && NR <= 500'
- 輸出行號在指定範圍內的行(記錄)。因此,充當行號過濾器。
- cat file.txt | awk 'NR == 1 || /reg.*pattern/'
- 輸出第一行和與正則表示式匹配的行。
- echo abcd | awk '{gsub(/ab/,"ef");print}'
- 替換,也稱為替換,類似於 sed 命令;gsub 中的 "g" 代表全域性。
- awk 'BEGIN{for(i=1;i<6;i++) print sqrt(i)}'
- 輸出 1、...、5 中整數的平方根。使用 BEGIN{} 確保程式碼無論是否有輸入行被饋送到 awk 都被執行。for 迴圈使用熟悉的 C 語言語法,sqrt 是多個可用數學函式之一。
- awk 'BEGIN{printf "%i %.2f\n", 1, (2+3)/7}'
- 支援從 C 語言中熟悉的 printf 函式,作為不需要圍繞引數的括號的語句。
- awk 'BEGIN{for(i=1;i<9;i++) a[i]=i^2; for(i in a) print i, a[i]}'
- 在 awk 關聯陣列(也稱為對映或字典)的幫助下,輸出幾個整數及其平方。輸出的順序是不確定的,這在關聯陣列中很常見。Awk 沒有從其他程式語言中知道的陣列和列表的直接類似物。
- cat file.txt | awk '{sum+=$1} END{print sum}'
- 使用 END 關鍵字輸出第一個欄位(列)中值的總和。
- printf 1,2,3\\n4,5,6 | awk -F, '{s=0;for(i=1; i<=NF; i++) {s+=$i} print s}'
- 對於逗號分隔檔案中的每一行,輸出該行中欄位(列)的總和。因此,遍歷欄位。
- echo 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 | awk -F, -vn=7 '{for(i=1;i<=NF; i++) {s+=i>n?$i-$(i-n):$i; if(i>=n){printf "%.0f, ", s/n}else{printf ", "}}}'
- 輸出逗號分隔輸入逗號分隔序列的 7 值簡單移動平均值。
- awk 'BEGIN{system("dir")}'
- 執行外部命令 dir;在沙箱模式下停用。
- awk 'function abs(x) {return x < 0 ? -x : x} BEGIN{print abs(-4)}'
- 定義並使用絕對值函式。展示了從 C 語言中知道的條件運算子的使用。
連結
- 有用的“單行命令”,AWK 手冊,第 1.0 版,staff.science.uu.nl
- awk per POSIX,“示例”部分,opengroup.org
- AWK 的便捷單行命令,catonmat.net
您可以在 http://awk.js.org/ 上線上嘗試 awk。關鍵詞:REPL 線上。
與其他指令碼語言相比,AWK 的限制包括以下內容
- 沒有從其他程式語言中知道的陣列和列表的直接類似物,只有關聯陣列。
- 沒有巢狀陣列:關聯陣列的值不能是陣列。
- 沒有真正的多維陣列:多個索引被儲存為透過分隔符連線索引而形成的單個索引。
- 在普通 awk 中沒有用於陣列的排序函式,只有在 gawk 中有。
- 在普通 awk 中沒有位運算子;gawk 有位操作函式,包括 and()、or()、compl() 等。
- 在傳統 awk 中不支援包含要由 awk 指令碼重用的函式的庫或模組;但是,gawk 支援用於該目的的 @include 關鍵字。
- 不支援 GUI 程式設計。
連結
- C.4 可能的未來擴充套件,GNU Awk 使用者指南,適用於 gawk 3.1.0,gnu.org
各種版本的 awk 的原始碼
- Brian Kernighan 的 awk,帶有一些額外的修復,如 onetrueawk/awk,github.com;克隆是 arnoldrobbins/bwk-awk
- Mike Brennan 的 mawk-2,github.com
- Thomas Dickey 的 mawk 版本,github.com
- gawk,git.savannah.gnu.org
- O'Reilly 的 sed & awk 袖珍參考
- UNIX 概覽
- UNIX 力量工具
- GNU Awk 使用者指南,gnu.org
- awk 手冊頁,freebsd.org
- Unix awk(1) manual page at man.cat-v.org
- awk POSIX 規範,opengroup.org
- 維基百科:AWK
- AWK 入門,cs.hmc.edu,此華夏公益教科書的原始來源
- 33.11 快速參考:awk,Peek、O'Reilly & Loukides 編著的 Unix Power Tools,docstore.mik.ua
- 類別:AWK,rosettacode.org
- comp.lang.awk,groups.google.com
- 在 Y 分鐘內學習 X,其中 X=awk,learnxinyminutes.com
- Awk 程式語言 (1988) [pdf] 來自 archive.org