變數 | 功能 |
---|---|
FIELDWIDTHS | 由空格分隔的一列數位,定義了每個資料欄位的確切寬度。 |
FNR | 當前輸入文件的記錄編號,常在有多個輸入文件時使用。 |
NR | 輸入流的當前記錄編號。 |
FS | 輸入欄位分隔符 |
RS | 輸入記錄分隔符,預設為換行符 n。 |
OFS | 輸出欄位分隔符,預設為空格。 |
ORS | 輸出記錄分隔符,預設為換行符 n。 |
[[email protected] ~]# cat data1
data11,data12,data13,data14,data15
data21,data22,data23,data24,data25
data31,data32,data33,data34,data35
[[email protected] ~]# awk 'BEGIN{FS=","; OFS="-"} {print $1,$2,$3}' data1
data11-data12-data13
data21-data22-data23
data31-data32-data33
[[email protected] ~]# awk 'BEGIN{FS=","; OFS="--"} {print $1,$2,$3}' data1
data11--data12--data13
data21--data22--data23
data31--data32--data33
[[email protected] ~]# cat data1b
1005.3247596.37
115-2.349194.00
05810.1298100.1
[[email protected] ~]# awk 'BEGIN{FIELDWIDTHS="3 5 2 5"}{print $1,$2,$3,$4}' data1b
100 5.324 75 96.37
115 -2.34 91 94.00
058 10.12 98 100.1
Riley Mullen
123 Main Street
Chicago, IL 60601
(312)555-1234
[[email protected] ~]# cat data2
Riley Mullen
123 Main Street
Chicago, IL 60601
(312)555-1234
Frank Williams
456 Oak Street
Indianapolis, IN 46201
(317)555-9876
Haley Snell
4231 Elm Street
Detroit, MI 48201
(313)555-4938
[[email protected] ~]# awk 'BEGIN{FS="n"; RS=""} {print $1,$4}' data2
Riley Mullen (312)555-1234
Frank Williams (317)555-9876
Haley Snell (313)555-4938
變數名 | 功能 |
---|---|
ARGC | 命令列引數個數。 |
ARGIND | 當前檔案在 ARGC 中的位置。 |
ARGV | 包含命令列引數的陣列。 |
CONVFMT | 數位的轉換格式,預設值為 %.6g。 |
ENVIRON | 當前 shell 環境變數及其值組成的關聯陣列。 |
ERRNO | 當讀取或關閉輸入檔案發生錯誤時的系統錯誤號。 |
FILENAME | 當前輸入文件的名稱。 |
FNR | 當前資料檔案中的資料行數。 |
IGNORECASE | 設成非 0 值時,忽略 awk 命令中出現的字串的字元大小寫。 |
NF | 資料檔案中的欄位總數。 |
NR | 已處理的輸入記錄數。 |
OFMT | 數位的輸出格式,預設值為 %.6g。 |
RLENGTH | 由 match 函數所匹配的子字串的長度。 |
TSTART | 由 match 函數所匹配的子字串的起始位置。 |
[[email protected] ~]# cat data1
data11,data12,data13,data14,data15
data21,data22,data23,data24,data25
data31,data32,data33,data34,data35
[[email protected] ~]# awk '
> BEGIN {FS=","}
> {print $1,"FNR="FNR,"NR="NR}
> END{print "There were",NR,"records processed"}' data1 data1
data11 FNR=1 NR=1
data21 FNR=2 NR=2
data31 FNR=3 NR=3
data11 FNR=1 NR=4
data21 FNR=2 NR=5
data31 FNR=3 NR=6
There were 6 records processed
[[email protected] ~]# awk '
> BEGIN{
> testing="This is a test"
> print testing
> testing=45
> print testing
> }'
This is a test
45
[[email protected] ~]# cat script1
BEGIN{FS=","} {print $n}
[[email protected] ~]# awk -f script1 n=2 data1
data12
data22
data32
[[email protected] ~]# awk -f script1 n=3 data1
data13
data23
data33
[[email protected] ~]# cat script2
BEGIN{print "The starting value is",n; FS=","}
{print $n}
[[email protected] ~]# awk -f script2 n=3 data1
The starting value is
data13
data23
data33
[[email protected] ~]# awk -v n=3 -f script2 data1
The starting value is 3
data13
data23
data33
如果你熟悉其他程式語言的話,其實關聯陣列和雜湊表、字典的用法類似。
var[index]=element
其中,var 是陣列名,index 是關聯陣列的索引值,element 是資料元素值。例如:
capital["Illinois"] = "Springfield"
capital["Indiana"] = "Indianapolis"
capital["Ohio"] = "Columbus"
[[email protected] ~]# awk 'BEGIN{
> capital["Illinois"] = "Springfield"
> print capital["Illinois"]
> }'
Springfield
[[email protected] ~]# awk 'BEGIN{
> var[1] = 34
> var[2] = 3
> total = var[1] + var[2]
> print total
> }'
37
for (var in array)
{
statements
}
再次強調,整個遍歷過程中,傳給 var 的都是每個陣列元素的索引值(也就是 index),不是陣列元素的值。
舉個例子:
[[email protected] ~]# awk 'BEGIN{
> var["a"] = 1
> var["g"] = 2
> var["m"] = 3
> var["u"] = 4
> for (test in var)
> {
> print "Index:",test," - Value:",var[test]
> }
> }'
Index: u - Value: 4
Index: m - Value: 3
Index: a - Value: 1
Index: g - Value: 2
delete array[index]
舉個例子:
[[email protected] ~]# awk 'BEGIN{
> var["a"] = 1
> var["g"] = 2
> for (test in var)
> {
> print "Index:",test," - Value:",var[test]
> }
> delete var["g"]
> print "---"
> for (test in var)
> {
> print "Index:",test," - Value:",var[test]
> }
> }'
Index: a - Value: 1
Index: g - Value: 2
---
Index: a - Value: 1
if (condition)
statement1
else
statements
if (condition) statement1;else statement2
舉個簡單的例子:
[[email protected] ~]# cat data4
10
5
13
50
34
[[email protected] ~]# awk '{if ($1 > 20) print $1 * 2; else print $1 / 2}' data4
5
2.5
6.5
100
68
基本格式 | 範例 |
---|---|
while (條件) { 執行程式碼; } |
[[email protected] ~]# cat data5 |
do { 執行程式碼; }while(條件) |
[[email protected] ~]# awk '{ |
for(變數;條件;計數器) { 執行程式碼; } |
[[email protected] ~]# awk '{ |
函數分類 | 函數原型 | 函數功能 |
---|---|---|
數學函數 | atan2(x, y) | x/y 的反正切,x 和 y 以弧度為單位。 |
cos(x) | x 的餘弦,x 以弧度為單位。 | |
exp(x) | x 的指數函數。 | |
int(x) | x 的整數部分,取靠近零一側的值。 | |
log(x) | x 的自然對數。 | |
srand(x) | 為計算亂數指定一個種子值。 | |
rand() | 比 0 大比 1 小的隨機浮點值。 | |
sin(x) | x 的正弦,x 以弧度為單位。 | |
sqrt(x) | x 的平方根。 | |
位運算函數 | and(v1, v2) | 執行值 v1 和 v2 的按位元與運算。 |
compl(val) | 執行 val 的補運算。 | |
lshift(val, count) | 將值 val 左移 count 位。 | |
or(v1, v2) | 執行值 v1 和 v2 的按位元或運算。 | |
rshift(val, count) | 將值 val 右移 count 位。 | |
xor(v1, v2) | 執行值 v1 和 v2 的按位元互斥或運算。 | |
字串函數 | asort(s [,d]) | 將陣列 s 按資料元素值排序。索引值會被替換成表示新的排序順序的連續數位。另外,如果指定了 d,則排序後的陣列會儲存在陣列 d 中。 |
asorti(s [,d]) | 將陣列 s 按索引值排序。生成的陣列會將索引值作為資料元素值,用連續數位索引來表明排序順序。另外如果指定了 d,排序後的陣列會儲存在陣列 d 中。 | |
gensub(r, s, h [, t]) | 查詢變數 $0 或目標字串 t(如果提供了的話)來匹配正規表示式 r。如果 h 是一個以 g 或 G 開頭的字串,就用 s 替換掉匹配的文字。如果 h 是一個數位,它表示要替換掉第 h 處 r 匹配的地方。 | |
gsub(r, s [,t]) | 查詢變數 $0 或目標字串 t(如果提供了的話)來匹配正規表示式 r。如果找到了,就全部替換成字串 s。 | |
index(s, t) | 返回字串 t 在字串 s 中的索引值,如果沒找到的話返回 0。 | |
length([s]) | 返回字串 s 的長度;如果沒有指定的話,返回 $0 的長度。 | |
match(s, r [,a]) | 返回字串 s 中正規表示式 r 出現位置的索引。如果指定了陣列 a,它會儲存 s 中匹配正規表示式的那部分。 | |
split(s, a [,r]) | 將 s 用 FS 字元或正規表示式 r(如果指定了的話)分開放到陣列 a 中,並返回欄位的總數。 | |
sprintf(format, variables) | 用提供的 format 和 variables 返回一個類似於 printf 輸出的字串。 | |
sub(r, s [,t]) | 在變數 $0 或目標字串 t 中查詢正規表示式 r 的匹配。如果找到了,就用字串 s 替換掉第一處匹配。 | |
substr(s, i [,n]) | 返回 s 中從索引值 i 開始的 n 個字元組成的子字串。如果未提供 n,則返回 s 剩下的部分。 | |
tolower(s) | 將 s 中的所有字元轉換成小寫。 | |
toupper(s) | 將 s 中的所有字元轉換成大寫。 | |
時間函數 | mktime(datespec) | 將一個按 YYYY MM DD HH MM SS [DST] 格式指定的日期轉換成時間戳值。 |
strftime(format [,timestamp]) | 將當前時間的時間戳或 timestamp(如果提供了的話)轉化格式化日期(採用 shell 函數 date() 的格式)。 | |
systime() | 返回當前時間的時間戳。 |
時間戳指的是格林威治時間,即從 1970年1月1日8時1起到現在的總秒數。
function 函數名(引數1,引數2,...)
{
執行程式碼;
}
function printthird()
{
print $3
}
function myrand(limit) {
return int(limit * rand())
}
[[email protected] ~]# cat funclib
function myprint() {
printf "%-16s - %sn", $1, $4
}
function myrand(limit)
{
return int(limit * rand())
}
function printthird()
{
print $3
}
[[email protected] ~]# cat script4
BEGIN{ FS="n"; RS=""}
{
myprint()
}
[[email protected] ~]# awk -f funclib -f script4 data2
Riley Mullen - (312)555-1234
Frank Williams - (317)555-9876
Haley Snell - (313)555-4938