【筆記】awk 命令 - 文本數(shù)據(jù)處理工具

外置命令糊余,awk 命令也是逐行掃描文件(從第 1 行到最后一行),尋找含有目標(biāo)文本的行涮帘,如果匹配成功拼苍,則會在該行上執(zhí)行用戶想要的操作;反之调缨,則不對行做任何處理疮鲫。

[root@localhost ~]# awk [選項(xiàng)] '腳本命令' 文件名
  • awk 命令的選項(xiàng)
選項(xiàng) 功能
-F fs 指定以 fs 作為輸入行的分隔符,awk 命令默認(rèn)分隔符為空格或制表符
-f file 從腳本文件中讀取 awk 腳本指令弦叶,以取代直接在命令行中輸入指令
-v var=val 在執(zhí)行處理過程之前俊犯,設(shè)置一個變量 var,并給其設(shè)備初始值為 val
  • awk 命令的腳本命令

awk 的強(qiáng)大之處在于腳本命令湾蔓,它由 2 部分組成瘫析,分別為匹配規(guī)則和執(zhí)行命令砌梆。

'匹配規(guī)則{執(zhí)行命令}'
  • 這里的匹配規(guī)則默责,和 sed 命令中的 address 部分作用相同贬循,用來指定腳本命令可以作用到文本內(nèi)容中的具體行,可以使用字符串(比如 /demo/桃序,表示查看含有 demo 字符串的行)或者正則表達(dá)式指定杖虾。另外需要注意的是,整個腳本命令是用單引號('')括起媒熊,而其中的執(zhí)行命令部分需要用大括號({})括起來奇适。
  • 在 awk 程序執(zhí)行時,如果沒有指定執(zhí)行命令芦鳍,則默認(rèn)會把匹配的行輸出嚷往;如果不指定匹配規(guī)則,則默認(rèn)匹配文本中所有的行柠衅。
  • 示例
[root@localhost ~]# awk '/^$/ {print "Blank line"}' test.txt

在此命令中皮仁,/^$/ 是一個正則表達(dá)式,功能是匹配文本中的空白行菲宴,同時可以看到贷祈,執(zhí)行命令使用的是 print 命令,此命令經(jīng)常會使用喝峦,它的作用很簡單势誊,就是將指定的文本進(jìn)行輸出。因此谣蠢,整個命令的功能是粟耻,如果 test.txt 有 N 個空白行,那么執(zhí)行此命令會輸出 N 個 Blank line漩怎。


1. awk 使用數(shù)據(jù)字段變量

awk 的主要特性之一是其處理文本文件中數(shù)據(jù)的能力勋颖,它會自動給一行中的每個數(shù)據(jù)元素分配一個變量。

默認(rèn)情況下勋锤,awk 會將如下變量分配給它在文本行中發(fā)現(xiàn)的數(shù)據(jù)字段:

  • $0 代表整個文本行饭玲;
  • $1 代表文本行中的第 1 個數(shù)據(jù)字段;
  • $2 代表文本行中的第 2 個數(shù)據(jù)字段叁执;
  • $n 代表文本行中的第 n 個數(shù)據(jù)字段茄厘。

在 awk 中,默認(rèn)的字段分隔符是任意的空白字符(例如空格或制表符)谈宛。 在文本行中次哈,每個數(shù)據(jù)字段都是通過字段分隔符劃分的。awk 在讀取一行文本時吆录,會用預(yù)定義的字段分隔符劃分每個數(shù)據(jù)字段窑滞。

  • 示例
[root@localhost ~]# cat data2.txt
One line of test text.
Two lines of test text.
Three lines of test text.
[root@localhost ~]# awk '{print $1}' data2.txt
One
Two
Three
# awk 程序讀取文本文件,只顯示第 1 個數(shù)據(jù)字段的值

2. awk 使用多個腳本命令

awk 允許將多條命令組合成一個正常的程序。要在命令行上的程序腳本中使用多條命令哀卫,只要在命令之間放個分號即可巨坊。

  • 示例
[root@localhost ~]# echo "My name is Rich" | awk '{$4="Christine"; print $0}'
My name is Christine
# 第一條命令會給字段變量 $4 賦值。第二條命令會打印整個數(shù)據(jù)字段此改≈耗欤可以看
# 到,awk 程序在輸出中已經(jīng)將原文本中的第四個數(shù)據(jù)字段替換成了新值
root@localhost ~]# awk '{
> $4="Christine"
> print $0}'
My name is Rich
My name is Christine
# 在你用了表示起始的單引號后共啃,bash shell 會使用 > 來提示輸入更多數(shù)據(jù)占调,
# 我們可以每次在每行加一條命令,直到輸入了結(jié)尾的單引號
# 注意移剪,此例中因?yàn)闆]有在命令行中指定文件名究珊,awk 程序需要用戶輸入獲得數(shù)
# 據(jù),因此當(dāng)運(yùn)行這個程序的時候纵苛,它會一直等著用戶輸入文本苦银,此時如果要退
# 出程序,只需按下 Ctrl+D 組合鍵即可

3. awk 從文件中讀取程序

跟 sed 一樣赶站,awk 允許將腳本命令存儲到文件中幔虏,然后再在命令行中引用。

  • 示例
[root@localhost ~]# cat awk.sh
{print $1 "'s home directory is " $6}
[root@localhost ~]# awk -F: -f awk.sh /etc/passwd
root's home directory is /root
bin's home directory is /bin
daemon's home directory is /sbin
adm's home directory is /var/adm
lp's home directory is /var/spool/lpd
...
Christine's home directory is /home/Christine
Samantha's home directory is /home/Samantha
Timothy's home directory is /home/Timothy
# awk.sh 腳本文件會使用 print 命令打印 /etc/passwd 文件的主目錄數(shù)據(jù)字
# 段(字段變量 $6)贝椿,以及 userid 數(shù)據(jù)字段(字段變量 $1)想括。注意,在程序
# 文件中烙博,也可以指定多條命令瑟蜈,只要一條命令放一行即可,之間不需要用分號

4. awk BEGIN關(guān)鍵字

awk 中還可以指定腳本命令的運(yùn)行時機(jī)渣窜。默認(rèn)情況下铺根,awk 會從輸入中讀取一行文本,然后針對該行的數(shù)據(jù)執(zhí)行程序腳本乔宿,但有時可能需要在處理數(shù)據(jù)前運(yùn)行一些腳本命令位迂,這就需要使用 BEGIN 關(guān)鍵字。BEGIN 會強(qiáng)制 awk 在讀取數(shù)據(jù)前執(zhí)行該關(guān)鍵字后指定的腳本命令详瑞。

  • 示例
[root@localhost ~]# cat data3.txt
Line 1
Line 2
Line 3
[root@localhost ~]# awk 'BEGIN {print "The data3 File Contents:"}
> {print $0}' data3.txt
The data3 File Contents:
Line 1
Line 2
Line 3
# 這里的腳本命令中分為 2 部分掂林,BEGIN 部分的腳本指令會在 awk 命令處理
# 數(shù)據(jù)前運(yùn)行,而真正用來處理數(shù)據(jù)的是第二段腳本命令

5. awk END關(guān)鍵字

和 BEGIN 關(guān)鍵字相對應(yīng)坝橡,END 關(guān)鍵字允許我們指定一些腳本命令泻帮,awk 會在讀完數(shù)據(jù)后執(zhí)行它們。

  • 示例
[root@localhost ~]# awk 'BEGIN {print "The data3 File Contents:"}
> {print $0}
> END {print "End of File"}' data3.txt
The data3 File Contents:
Line 1
Line 2
Line 3
End of File
# 當(dāng) awk 程序打印完文件內(nèi)容后计寇,才會執(zhí)行 END 中的腳本命令

6. awk 使用變量

在 awk 的腳本程序中锣杂,支持使用變量來存取值脂倦。awk 支持兩種不同類型的變量:

  • 內(nèi)建變量:awk 本身就創(chuàng)建好,用戶可以直接拿來用的變量元莫,這些變量用來存放處理數(shù)據(jù)文件中的某些字段和記錄的信息狼讨。
  • 自定義變量:awk 支持用戶自己創(chuàng)建變量。

6.1 內(nèi)建變量

awk 程序使用內(nèi)建變量來引用程序數(shù)據(jù)里的一些特殊功能柒竞。常見的一些內(nèi)建變量,包括上一節(jié)介紹的數(shù)據(jù)字段變量($0播聪、$1朽基、$2...$n)以及下表所示的這些變量。

  • 字段和記錄分隔符變量
變量 功能
FIELDWIDTHS 由空格分隔的一列數(shù)字离陶,定義了每個數(shù)據(jù)字段的確切寬度
FNR 當(dāng)前輸入文檔的記錄編號稼虎,常在有多個輸入文檔時使用
NR 輸入流的當(dāng)前記錄編號
FS 輸入字段分隔符
RS 輸入記錄分隔符,默認(rèn)為換行符 \n
OFS 輸出字段分隔符招刨,默認(rèn)為空格
ORS 輸出記錄分隔符霎俩,默認(rèn)為換行符 \n
  • 變量 FS 和 OFS 定義了 awk 如何處理數(shù)據(jù)流中的數(shù)據(jù)字段。我們已經(jīng)知道了如何使用變量 FS 來定義記錄中的字段分隔符沉眶,變量 OFS 具備相同的功能打却,只不過是用在 print 命令的輸出上。
  • FIELDWIDTHS 變量允許用戶不依靠字段分隔符來讀取記錄谎倔。在一些應(yīng)用程序中柳击,數(shù)據(jù)并沒有使用字段分隔符,而是被放置在了記錄中的特定列片习,這種情況下捌肴,必須設(shè)定 FIELDWIDTHS 變量來匹配數(shù)據(jù)在記錄中的位置。一旦設(shè)置了 FIELDWIDTH 變量藕咏,awk 就會忽略 FS 變量状知,并根據(jù)提供的字段寬度來計算字段。
  • 變量 RS 和 ORS 定義了 awk 程序如何處理數(shù)據(jù)流中的字段孽查,默認(rèn)情況下饥悴,awk 將 RS 和 ORS 設(shè)為換行符。默認(rèn)的 RS 值表明盲再,輸入數(shù)據(jù)流中的每行新文本就是一條新紀(jì)錄铺坞。 有時,你會在數(shù)據(jù)流中碰到占據(jù)多行的字段洲胖。典型的例子是包含地址和電話號碼的數(shù)據(jù)济榨,其中地址和電話號碼各占一行。
  • 環(huán)境信息變量
變量名 功能
ARGC 命令行參數(shù)個數(shù)
ARGIND 當(dāng)前文件在 ARGC 中的位置
ARGV 包含命令行參數(shù)的數(shù)組
CONVFMT 數(shù)字的轉(zhuǎn)換格式绿映,默認(rèn)值為 %.6g
ENVIRON 當(dāng)前 shell 環(huán)境變量及其值組成的關(guān)聯(lián)數(shù)組
ERRNO 當(dāng)讀取或關(guān)閉輸入文件發(fā)生錯誤時的系統(tǒng)錯誤號
FILENAME 當(dāng)前輸入文檔的名稱
FNR 當(dāng)前數(shù)據(jù)文件中的數(shù)據(jù)行數(shù)
IGNORECASE 設(shè)成非 0 值時擒滑,忽略 awk 命令中出現(xiàn)的字符串的字符大小寫
NF 數(shù)據(jù)文件中的字段總數(shù)
NR 已處理的輸入記錄數(shù)
OFMT 數(shù)字的輸出格式腐晾,默認(rèn)值為 %.6g
RLENGTH 由 match 函數(shù)所匹配的子字符串的長度
TSTART 由 match 函數(shù)所匹配的子字符串的起始位置

FNR 和 NR 變量雖然類似,但又略有不同丐一。FNR 變量含有當(dāng)前數(shù)據(jù)文件中已處理過的記錄數(shù)藻糖,NR 變量則含有已處理過的記錄總數(shù)。

  • 示例
[root@localhost ~]# cat data1
data11,data12,data13,data14,data15
data21,data22,data23,data24,data25
data31,data32,data33,data34,data35
[root@localhost ~]# awk 'BEGIN{FS=","; OFS="-"} {print $1,$2,$3}' data1
data11-data12-data13
data21-data22-data23
data31-data32-data33
[root@localhost ~]# awk 'BEGIN{FS=","; OFS="--"} {print $1,$2,$3}' data1
data11--data12--data13
data21--data22--data23
data31--data32--data33
# print 命令會自動將 OFS 變量的值放置在輸出中的每個字段間库车。
# 通過設(shè)置 OFS 變量巨柒,可以在輸出中使用任意字符串來分隔字段
[root@localhost ~]# cat data1b
1005.3247596.37
115-2.349194.00
05810.1298100.1
[root@localhost ~]# 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
# 一旦設(shè)定了 FIELDWIDTHS 變量的值,就不能再改變了柠衍,因此洋满,這種
# 方法并不適用于變長的字段
[root@localhost ~]# 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
[root@localhost ~]# awk 'BEGIN{FS="\n"; RS=""} {print $1,$4}' data2
Riley Mullen (312)555-1234
Frank Williams (317)555-9876
Haley Snell (313)555-4938
# 把 FS 變量設(shè)置成換行符,這就表明數(shù)據(jù)流中的每行都是一個單獨(dú)的字
# 段珍坊,每行上的所有數(shù)據(jù)都屬于同一個字段牺勾;與此同時,把 RS 變量設(shè)置
# 成空字符串阵漏,然后在數(shù)據(jù)記錄間留一個空白行驻民,awk 會把每個空白行當(dāng)
# 作一個記錄分隔符
[root@localhost ~]# cat data1
data11,data12,data13,data14,data15
data21,data22,data23,data24,data25
data31,data32,data33,data34,data35
[root@localhost ~]# 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
# 當(dāng)只使用一個數(shù)據(jù)文件作為輸入時,F(xiàn)NR 和 NR 的值是相同的履怯;如果
# 使用多個數(shù)據(jù)文件作為輸入回还,F(xiàn)NR 的值會在處理每個數(shù)據(jù)文件時被重置,
# 而 NR 的值則會繼續(xù)計數(shù)直到處理完所有的數(shù)據(jù)文件

6.2 自定義變量

和其他典型的編程語言一樣叹洲,awk 允許用戶定義自己的變量在腳本程序中使用懦趋。awk 自定義變量名可以是任意數(shù)目的字母、數(shù)字和下劃線疹味,但不能以數(shù)字開頭仅叫。更重要的是,awk 變量名區(qū)分大小寫糙捺。

  • 示例
[root@localhost ~]# awk '
> BEGIN{
> testing="This is a test"
> print testing
> testing=45
> print testing
> }'
This is a test
45
# print 語句的輸出是 testing 變量的當(dāng)前值
[root@localhost ~]# cat script1
BEGIN{FS=","} {print $n}
[root@localhost ~]# awk -f script1 n=2 data1
data12
data22
data32
[root@localhost ~]# awk -f script1 n=3 data1
data13
data23
data33
# 可以用 awk 命令行來給程序中的變量賦值诫咱,這允許我們在正常的代碼
# 之外賦值,即時改變變量的值
[root@localhost ~]# cat script2
BEGIN{print "The starting value is",n; FS=","}
{print $n}
[root@localhost ~]# awk -f script2 n=3 data1
The starting value is
data13
data23
data33
# 使用命令行參數(shù)來定義變量值會有一個問題洪灯,即設(shè)置了變量后坎缭,這個值
# 在代碼的 BEGIN 部分不可用
[root@localhost ~]# awk -v n=3 -f script2 data1
The starting value is 3
data13
data23
data33
# 可以用 -v 命令行參數(shù),它可以實(shí)現(xiàn)在 BEGIN 代碼之前設(shè)定變量签钩。在命
# 令行上掏呼,-v 命令行參數(shù)必須放在腳本代碼之前

7. awk 使用數(shù)組

為了在單個變量中存儲多個值,許多編程語言都提供數(shù)組铅檩,awk 使用關(guān)聯(lián)數(shù)組提供數(shù)組功能憎夷。
關(guān)聯(lián)數(shù)組跟數(shù)字?jǐn)?shù)組不同之處在于,它的索引值可以是任意文本字符串昧旨。用戶不需要用連續(xù)的數(shù)字來標(biāo)識數(shù)組中的數(shù)據(jù)元素拾给;相反祥得,關(guān)聯(lián)數(shù)組用各種字符串來引用值。每個索引字符串都必須能夠唯一地標(biāo)識出賦給它的數(shù)據(jù)元素蒋得。

7.1 關(guān)聯(lián)數(shù)組的定義和使用

在 awk 腳本程序中级及,定義一個數(shù)組變量可以使用標(biāo)準(zhǔn)復(fù)制語句。

var[index]=element
  • 其中额衙,var 是數(shù)組名饮焦,index 是關(guān)聯(lián)數(shù)組的索引值,element 是數(shù)據(jù)元素值窍侧。
  • 示例
[root@localhost ~]# awk 'BEGIN{
> capital["Illinois"] = "Springfield"
> print capital["Illinois"]
> }'
Springfield
# 在引用數(shù)組變量時县踢,必須用索引值(index)來提取相應(yīng)的數(shù)據(jù)元素值
[root@localhost ~]# awk 'BEGIN{
> var[1] = 34
> var[2] = 3
> total = var[1] + var[2]
> print total
> }'
37
# 數(shù)組變量也是變量,也可以使用其進(jìn)行基本的算術(shù)運(yùn)算

7.2 關(guān)聯(lián)數(shù)組的遍歷

for (var in array)
{
    statements
}

這個 for 語句會在每次循環(huán)時將關(guān)聯(lián)數(shù)組 array 的下一個索引值賦給變量 var疏之,然后執(zhí)行一遍 statements。
再次強(qiáng)調(diào)暇咆,整個遍歷過程中锋爪,傳給 var 的都是每個數(shù)組元素的索引值(也就是 index),不是數(shù)組元素的值爸业。

  • 示例
[root@localhost ~]# 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
# 注意其骄,索引值不會按任何特定順序返回,但它們都能夠指向?qū)?yīng)的數(shù)據(jù)元素值

7.3 刪除數(shù)組變量

awk腳本程序還支持從關(guān)聯(lián)數(shù)組中刪除某個數(shù)組索引扯旷,使用 delete 命令就可以拯爽,此命令會從數(shù)組中刪除指定的索引值及相關(guān)的數(shù)據(jù)元素的值。

delete array[index]
  • 示例
[root@localhost ~]# 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
# 需要注意的是钧忽,一旦從關(guān)聯(lián)數(shù)組中刪除了索引值毯炮,就沒法再用它
# 來提取元素值

8. awk 使用分支結(jié)構(gòu)

if (condition)
    statement1
else
    statements
也可以將它放在一行上
if (condition) statement1;else statement2
  • 示例
[root@localhost ~]# cat data4
10
5
13
50
34
[root@localhost ~]# awk '{if ($1 > 20) print $1 * 2; else print $1 / 2}' data4
5
2.5
6.5
100
68

9. awk 使用循環(huán)結(jié)構(gòu)

awk 腳本程序中耸黑,可以使用 while桃煎、do-while、for 這 3 種循環(huán)結(jié)構(gòu)大刊。

while (條件) {
   運(yùn)行代碼为迈;
}
# 第一種結(jié)構(gòu)
do
{
運(yùn)行代碼;
}while(條件)
# 第二種結(jié)構(gòu)
for(變量缺菌;條件葫辐;計數(shù)器)
{
    運(yùn)行代碼;
}
# 第三種結(jié)構(gòu)

awk 支持使用的循環(huán)結(jié)構(gòu)的用法和 C 語言完全一樣伴郁,除此之外耿战,awk 還支持使用 break(跳出循環(huán))、continue(終止當(dāng)前循環(huán))關(guān)鍵字焊傅,其用法和 C 語言中也完全相同昆箕。

  • 示例
[root@localhost ~]# cat data5
130 120 135
160 113 140
145 170 215
[root@localhost ~]# awk '{
> total = 0
> i = 1
> while (i < 4)
> {
>    total += $i
>    i++
> }
> avg = total / 3
> print "Average:",avg
> }' data5
Average: 128.333
Average: 137.667
Average: 176.667
# 第一種結(jié)構(gòu)
[root@localhost ~]# awk '{
> total = 0
> i = 1
> do
> {
>    total += $i
>    i++
> } while (total < 150)
> print total }' data5
250
160
315
# 第二種結(jié)構(gòu)
[root@localhost ~]# awk '{
> total = 0
> for (i = 1; i < 4; i++)
> {
>    total += $i
> }
> avg = total / 3
> print "Average:",avg
> }' data5
Average: 128.333
Average: 137.667
Average: 176.667
# 第三種結(jié)構(gòu)

10. awk 使用函數(shù)

10.1 內(nèi)建函數(shù)

和內(nèi)建變量類似鸦列,awk 也提供了不少內(nèi)建函數(shù),可進(jìn)行一些常見的數(shù)學(xué)鹏倘、字符串以及時間函數(shù)運(yùn)算薯嗤。

分類 函數(shù)原型 函數(shù)功能
數(shù) atan2(x, y) x/y 的反正切,x 和 y 以弧度為單位
學(xué) cos(x) x 的余弦纤泵,x 以弧度為單位
exp(x) x 的指數(shù)函數(shù)
數(shù) int(x) x 的整數(shù)部分骆姐,取靠近零一側(cè)的值
log(x) x 的自然對數(shù)
srand(x) 為計算隨機(jī)數(shù)指定一個種子值
rand() 比 0 大比 1 小的隨機(jī)浮點(diǎn)值
sin(x) x 的正弦,x 以弧度為單位
sqrt(x) x 的平方根
and(v1, v2) 執(zhí)行值 v1 和 v2 的按位與運(yùn)算
運(yùn) compl(val) 執(zhí)行 val 的補(bǔ)運(yùn)算
lshift(val, count) 將值 val 左移 count 位
or(v1, v2) 執(zhí)行值 v1 和 v2 的按位或運(yùn)算
數(shù) rshift(val, count) 將值 val 右移 count 位
xor(v1, v2) 執(zhí)行值 v1 和 v2 的按位異或運(yùn)算
asort(s [,d]) 將數(shù)組 s 按數(shù)據(jù)元素值排序捏题。索引值會被替換成表示新的排序順序的連續(xù)數(shù)字玻褪。另外,如果指定了 d公荧,則排序后的數(shù)組會存儲在數(shù)組 d 中
asorti(s [,d]) 將數(shù)組 s 按索引值排序带射。生成的數(shù)組會將索引值作為數(shù)據(jù)元素值,用連續(xù)數(shù)字索引來表明排序順序循狰。另外如果指定了 d窟社,排序后的數(shù)組會存儲在數(shù)組 d 中
gensub(r, s, h [, t]) 查找變量 $0 或目標(biāo)字符串 t(如果提供了的話)來匹配正則表達(dá)式 r。如果 h 是一個以 g 或 G 開頭的字符串绪钥,就用 s 替換掉匹配的文本灿里。如果 h 是一個數(shù)字,它表示要替換掉第 h 處 r 匹配的地方
gsub(r, s [,t]) 查找變量 $0 或目標(biāo)字符串 t(如果提供了的話)來匹配正則表達(dá)式 r程腹。如果找到了匣吊,就全部替換成字符串 s
數(shù) index(s, t) 返回字符串 t 在字符串 s 中的索引值,如果沒找到的話返回 0
length([s]) 返回字符串 s 的長度寸潦;如果沒有指定的話色鸳,返回 $0 的長度
match(s, r [,a]) 返回字符串 s 中正則表達(dá)式 r 出現(xiàn)位置的索引。如果指定了數(shù)組 a见转,它會存儲 s 中匹配正則表達(dá)式的那部分
split(s, a [,r]) 將 s 用 FS 字符或正則表達(dá)式 r(如果指定了的話)分開放到數(shù)組 a 中缕碎,并返回字段的總數(shù)
sprintf(format, variables) 用提供的 format 和 variables 返回一個類似于 printf 輸出的字符串
sub(r, s [,t]) 在變量 $0 或目標(biāo)字符串 t 中查找正則表達(dá)式 r 的匹配。如果找到了池户,就用字符串 s 替換掉第一處匹配
substr(s, i [,n]) 返回 s 中從索引值 i 開始的 n 個字符組成的子字符串咏雌。如果未提供 n,則返回 s 剩下的部分
tolower(s) 將 s 中的所有字符轉(zhuǎn)換成小寫
toupper(s) 將 s 中的所有字符轉(zhuǎn)換成大寫
mktime(datespec) 將一個按 YYYY MM DD HH MM SS [DST] 格式指定的日期轉(zhuǎn)換成時間戳值
strftime(format [,timestamp]) 將當(dāng)前時間的時間戳或 timestamp(如果提供了的話)轉(zhuǎn)化格式化日期(采用 shell 函數(shù) date() 的格式)
systime() 返回當(dāng)前時間的時間戳
數(shù)
  • 時間戳指的是格林威治時間校焦,即從 1970年1月1日8時1起到現(xiàn)在的總秒數(shù)赊抖。

10.2 自定義函數(shù)

除了awk 中的內(nèi)建函數(shù),還可以在 awk 腳本程序中自定義函數(shù)寨典。注意氛雪,自定義函數(shù)的函數(shù)名必須能夠唯一標(biāo)識此函數(shù),換句話說耸成,在同一個 awk 腳本程序中报亩,多個函數(shù)的函數(shù)名不能相同浴鸿。同時,函數(shù)的參數(shù)可以有多個(0 個弦追、1 個或多個)岳链。需要注意的是,在定義函數(shù)時劲件,它必須出現(xiàn)在所有代碼塊之前(包括 BEGIN 和 END代碼塊)掸哑。

function 函數(shù)名(參數(shù)1,參數(shù)2零远,...)
{
    運(yùn)行代碼苗分;
}
  • 示例
function printthird()
{
    print $3
}
# 此函數(shù)會打印記錄中的第三個數(shù)據(jù)字段

10.3 創(chuàng)建函數(shù)庫

awk 提供了一種途徑來將多個函數(shù)放到一個庫文件中,這樣用戶就能在所有的 awk 腳本程序中使用了牵辣。

  • 示例
[root@localhost ~]# cat funclib
function myprint() {
   printf "%-16s - %s\n", $1, $4
}
function myrand(limit)
{
   return int(limit * rand())
}
function printthird()
{
   print $3
}
# 創(chuàng)建一個存儲所有 awk 函數(shù)的文件
[root@localhost ~]# cat script4
BEGIN{ FS="\n"; RS=""}
{
     myprint()
}
[root@localhost ~]# awk -f funclib -f script4 data2
Riley Mullen     - (312)555-1234
Frank Williams   - (317)555-9876
Haley Snell      - (313)555-4938
# 要想讓 awk 成功讀取 funclib 函數(shù)庫文件摔癣,就需要使用 -f 選
# 項(xiàng)酬凳,但此選項(xiàng)無法和 awk 腳本程序同時放到命令行中一起使用梁丘。
# 因此,要使用庫函數(shù)文件婿着,只能再創(chuàng)建一個腳本程序文件

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末罢猪,一起剝皮案震驚了整個濱河市近她,隨后出現(xiàn)的幾起案子叉瘩,更是在濱河造成了極大的恐慌膳帕,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件薇缅,死亡現(xiàn)場離奇詭異危彩,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)泳桦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進(jìn)店門汤徽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人灸撰,你說我怎么就攤上這事谒府。” “怎么了浮毯?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵完疫,是天一觀的道長。 經(jīng)常有香客問我债蓝,道長壳鹤,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任饰迹,我火速辦了婚禮芳誓,結(jié)果婚禮上余舶,老公的妹妹穿的比我還像新娘。我一直安慰自己锹淌,他們只是感情好匿值,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著葛圃,像睡著了一般千扔。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上库正,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天曲楚,我揣著相機(jī)與錄音,去河邊找鬼褥符。 笑死龙誊,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的喷楣。 我是一名探鬼主播趟大,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼铣焊!你這毒婦竟也來了逊朽?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤曲伊,失蹤者是張志新(化名)和其女友劉穎叽讳,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體坟募,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡岛蚤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了懈糯。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片涤妒。...
    茶點(diǎn)故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖赚哗,靈堂內(nèi)的尸體忽然破棺而出她紫,到底是詐尸還是另有隱情,我是刑警寧澤屿储,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布贿讹,位于F島的核電站,受9級特大地震影響扩所,放射性物質(zhì)發(fā)生泄漏围详。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望助赞。 院中可真熱鬧买羞,春花似錦、人聲如沸雹食。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽群叶。三九已至吃挑,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間街立,已是汗流浹背舶衬。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留赎离,地道東北人逛犹。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像梁剔,于是被迫代替她去往敵國和親虽画。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評論 2 360