linux的gawk命令
目錄
1.awk 簡(jiǎn)介
2.awk 概述
3. 工作原理
4.gawk程序的可用選項(xiàng)
5.基礎(chǔ)使用示例
5.1 使用數(shù)據(jù)字段變量:
5.2 指定分隔符
5.3 在程序腳本中使用多個(gè)命令
5.4 從文件中讀取程序
5.5 在處理數(shù)據(jù)前后運(yùn)行腳本
6 進(jìn)階使用
6.1內(nèi)置變量
1.字段和記錄分隔符變量:
2.數(shù)據(jù)變量
6.2自定義變量
1. 在腳本中給變量賦值
2.在命令行上給變量賦值
6.3 處理數(shù)組
1.定義數(shù)組變量
2.遍歷數(shù)組變量
3.刪除數(shù)組變量
6.4 使用模式
1.正則表達(dá)式
2.匹配操作符
3.數(shù)學(xué)表達(dá)式
6.5 結(jié)構(gòu)化命令
1. if 語(yǔ)句
2.while 語(yǔ)句
3.for語(yǔ)句
6.6 格式化打印
6.7 內(nèi)建函數(shù)
1.數(shù)學(xué)函數(shù)
2.字符串函數(shù)
3. 時(shí)間函數(shù)
4.自定義函數(shù)
7.實(shí)例
?
1.awk 簡(jiǎn)介
awk 以記錄和字段的方式來(lái)查看文本文件
和其他編程語(yǔ)言一樣, awk 包含變量、條件和循環(huán)
awk 能夠進(jìn)行運(yùn)算和字符串操作
awk 能夠生成格式化的報(bào)表數(shù)據(jù)
2.awk 概述
awk 程序 awk 命令、括在括號(hào)(或?qū)懺谖募?#xff09;中的程序指令以及輸入文件的文件名幾個(gè)部分組成。如果沒(méi)有輸入文件,輸入則來(lái)自于標(biāo)準(zhǔn)輸入。
awk 指令由模式、操作或者模式與操作的組合組成。模式是由某種類型的表達(dá)式組成的語(yǔ)句。如果某個(gè)表達(dá)式中沒(méi)有出現(xiàn)關(guān)鍵在 if ,但實(shí)際在計(jì)算時(shí)卻暗含 if 這個(gè)詞,那么這個(gè)表達(dá)式就是模式。操作由括在大括號(hào)中的一條或多條語(yǔ)句組成,語(yǔ)句之間用分號(hào)或者換行符隔開(kāi)。模式不能括在大括號(hào)中,模式由包括在兩個(gè)正斜杠之間的正則表達(dá)式、一個(gè)或多個(gè) awk 操作符組成的表達(dá)式組成。
格式:
awk '/search pattern1/ {Actions}
/search pattern2/ {Actions}' file
3. 工作原理
awk 使用一行作為輸入(通過(guò)文件或者管道),并將這一行賦給內(nèi)部變量 $0
行被空格分解為字段(單詞),每一個(gè)字段存儲(chǔ)在已編號(hào)的變量中,從 $1 開(kāi)始。( awk 的內(nèi)部變量 FS 用來(lái)確定字段的分隔符。初始時(shí),為空格,包含制表符和空格符)
對(duì)于一行,按照給定的正則表達(dá)式的順序進(jìn)行匹配,如果匹配則執(zhí)行對(duì)應(yīng)的 Action ,如果沒(méi)有匹配上則不執(zhí)行任何動(dòng)作 , Search Pattern 和 Action 是可選的,但是必須提供其中一個(gè) 。如果 Search Pattern 未提供,則對(duì)所有的輸入行執(zhí)行 Action 操作。如果 Action 未提供,則默認(rèn)打印出該行的數(shù)據(jù) 。 {} 這種 Action 不做任何事情,和未提供的 Action 的工作方式不一樣
打印字段,用 print 、 printf 、 sprintf ,格式: { print $1, $3 } 內(nèi)部變量 output field separator ( OFS ),默認(rèn)為空格, $n 之間的逗號(hào)被 OFS 中的字符替換。
輸出之后,從文件中另取一行,并將其復(fù)制到 $0 中,覆蓋原來(lái)的內(nèi)容。重復(fù)進(jìn)行……
4.gawk程序的可用選項(xiàng)
5.基礎(chǔ)使用示例
5.1 使用數(shù)據(jù)字段變量:
- ?$0 代表整個(gè)文本行;
- ?$1 代表文本行中的第1個(gè)數(shù)據(jù)字段;
- ?$2 代表文本行中的第2個(gè)數(shù)據(jù)字段;
- ?$n 代表文本行中的第n個(gè)數(shù)據(jù)字段。
該程序用 $1 字段變量來(lái)僅顯示每行文本的第1個(gè)數(shù)據(jù)字段。
5.2 指定分隔符
如果你要讀取采用了其他字段分隔符的文件,可以用 -F 選項(xiàng)指定。
gawk -F: '{print $1}' /etc/passwd這個(gè)簡(jiǎn)短的程序顯示了系統(tǒng)中密碼文件的第1個(gè)數(shù)據(jù)字段。由于/etc/passwd文件用冒號(hào)來(lái)分隔數(shù)字字段,因而如果要?jiǎng)澐珠_(kāi)每個(gè)數(shù)據(jù)元素,則必須在 gawk 選項(xiàng)中將冒號(hào)指定為字段分隔符
5.3 在程序腳本中使用多個(gè)命令
如果一種編程語(yǔ)言只能執(zhí)行一條命令,那么它不會(huì)有太大用處。gawk編程語(yǔ)言允許你將多條命令組合成一個(gè)正常的程序。要在命令行上的程序腳本中使用多條命令,只要在命令之間放個(gè)分號(hào)即可。
第一條命令會(huì)給字段變量 $4 賦值。第二條命令會(huì)打印整個(gè)數(shù)據(jù)字段。注意, gawk程序在輸出中已經(jīng)將原文本中的第四個(gè)數(shù)據(jù)字段替換成了新值。
5.4 從文件中讀取程序
跟sed編輯器一樣,gawk編輯器允許將程序存儲(chǔ)到文件中,然后再在命令行中引用
script2.gawk程序腳本會(huì)再次使用 print 命令打印/etc/passwd文件的主目錄數(shù)據(jù)字段(字段變量 $6 ),以及 userid 數(shù)據(jù)字段(字段變量 $1 )。
可以在程序文件中指定多條命令。要這么做的話,只要一條命令放一行即可,不需要用分號(hào)。
5.5 在處理數(shù)據(jù)前后運(yùn)行腳本
gawk還允許指定程序腳本何時(shí)運(yùn)行。默認(rèn)情況下,gawk會(huì)從輸入中讀取一行文本,然后針對(duì)該行的數(shù)據(jù)執(zhí)行程序腳本。有時(shí)可能需要在處理數(shù)據(jù)前運(yùn)行腳本,比如為報(bào)告創(chuàng)建標(biāo)題。 BEGIN關(guān)鍵字就是用來(lái)做這個(gè)的。它會(huì)強(qiáng)制gawk在讀取數(shù)據(jù)前執(zhí)行 BEGIN 關(guān)鍵字后指定的程序腳本。
在gawk執(zhí)行了BEGIN腳本后,它會(huì)用第二段腳本來(lái)處理文件數(shù)據(jù)。這么做時(shí)要小心,兩段腳本仍然被認(rèn)為是 gawk 命令行中的一個(gè)文本字符串。你需要相應(yīng)地加上單引號(hào)。
與 BEGIN 關(guān)鍵字類似, END 關(guān)鍵字允許你指定一個(gè)程序腳本,gawk會(huì)在讀完數(shù)據(jù)后執(zhí)行它。
6 進(jìn)階使用
6.1內(nèi)置變量
1.字段和記錄分隔符變量:
變量 FS 和 OFS 定義了gawk如何處理數(shù)據(jù)流中的數(shù)據(jù)字段。你已經(jīng)知道了如何使用變量 FS 來(lái)定義記錄中的字段分隔符。變量 OFS 具備相同的功能,只不過(guò)是用在 print 命令的輸出上。默認(rèn)情況下,gawk將 OFS 設(shè)成一個(gè)空格,所以如果你用命令:
print $1,$2,$3會(huì)看到如下輸出:
field1 field2 field3print 命令會(huì)自動(dòng)將 OFS 變量的值放置在輸出中的每個(gè)字段間。通過(guò)設(shè)置 OFS 變量,可以在輸出中使用任意字符串來(lái)分隔字段。
FIELDWIDTHS 變量允許你不依靠字段分隔符來(lái)讀取記錄。在一些應(yīng)用程序中,數(shù)據(jù)并沒(méi)有使用字段分隔符,而是被放置在了記錄中的特定列。這種情況下,必須設(shè)定 FIELDWIDTHS 變量來(lái)匹配數(shù)據(jù)在記錄中的位置。一旦設(shè)置了 FIELDWIDTH 變量,gawk就會(huì)忽略 FS 變量,并根據(jù)提供的字段寬度來(lái)計(jì)算字段。下面是個(gè)采用字段寬度而非字段分隔符的例子。
FIELDWIDTHS 變量定義了四個(gè)字段,gawk依此來(lái)解析數(shù)據(jù)記錄。每個(gè)記錄中的數(shù)字串會(huì)根據(jù)已定義好的字段長(zhǎng)度來(lái)分割
警告 :一定要記住,一旦設(shè)定了 FIELDWIDTHS 變量的值,就不能再改變了。這種方法并不適用于變長(zhǎng)的字段。
變量 RS 和 ORS 定義了gawk程序如何處理數(shù)據(jù)流中的字段。默認(rèn)情況下,gawk將 RS 和 ORS 設(shè)為換行符。默認(rèn)的 RS 值表明,輸入數(shù)據(jù)流中的每行新文本就是一條新紀(jì)錄。有時(shí),你會(huì)在數(shù)據(jù)流中碰到占據(jù)多行的字段。典型的例子是包含地址和電話號(hào)碼的數(shù)據(jù),其
中地址和電話號(hào)碼各占一行。
如果你用默認(rèn)的 FS 和 RS 變量值來(lái)讀取這組數(shù)據(jù),gawk就會(huì)把每行作為一條單獨(dú)的記錄來(lái)讀取,并將記錄中的空格當(dāng)作字段分隔符。這可不是你希望看到的。要解決這個(gè)問(wèn)題,只需把 FS 變量設(shè)置成換行符。這就表明數(shù)據(jù)流中的每行都是一個(gè)單獨(dú)的字段,每行上的所有數(shù)據(jù)都屬于同一個(gè)字段。但現(xiàn)在令你頭疼的是無(wú)從判斷一個(gè)新的數(shù)據(jù)行從何開(kāi)始。
?????? 對(duì)于這一問(wèn)題,可以把 RS 變量設(shè)置成空字符串,然后在數(shù)據(jù)記錄間留一個(gè)空白行。gawk會(huì)把每個(gè)空白行當(dāng)作一個(gè)記錄分隔符。
2.數(shù)據(jù)變量
除了字段和記錄分隔符變量外,gawk還提供了其他一些內(nèi)建變量來(lái)幫助你了解數(shù)據(jù)發(fā)生了什么變化,并提取shell環(huán)境的信息
你應(yīng)該能從上面的列表中認(rèn)出一些shell腳本編程中的變量。 ARGC 和 ARGV 變量允許從shell中獲得命令行參數(shù)的總數(shù)以及它們的值。但這可能有點(diǎn)麻煩,因?yàn)間awk并不會(huì)將程序腳本當(dāng)成命令行參數(shù)的一部分。
ARGC 變量表明命令行上有兩個(gè)參數(shù)。這包括 gawk 命令和 data1 參數(shù)(記住,程序腳本并不算參數(shù))。 ARGV 數(shù)組從索引 0 開(kāi)始,代表的是命令。第一個(gè)數(shù)組值是 gawk 命令后的第一個(gè)命令行參數(shù)。
說(shuō)明 跟shell變量不同,在腳本中引用gawk變量時(shí),變量名前不加美元符。
ENVIRON["HOME"] 變量從shell中提取了 HOME 環(huán)境變量的值。類似地, ENVIRON["PATH"] 提取了 PATH 環(huán)境變量的值。可以用這種方法來(lái)從shell中提取任何環(huán)境變量的值,以供gawk程序使用。
?????? 當(dāng)要在gawk程序中跟蹤數(shù)據(jù)字段和記錄時(shí),變量 FNR 、 NF 和 NR 用起來(lái)就非常方便。有時(shí)你并不知道記錄中到底有多少個(gè)數(shù)據(jù)字段。 NF 變量可以讓你在不知道具體位置的情況下指定記錄中的最后一個(gè)數(shù)據(jù)字段。
NF: The variable NF is set to the total number of fields in the input record.
?????? NR:The total number of input records seen so far.
????? NF 變量含有數(shù)據(jù)文件中最后一個(gè)數(shù)據(jù)字段的數(shù)字值。可以在它前面加個(gè)美元符將其用作字段變量。
????? FNR 和 NR 變量雖然類似,但又略有不同。 FNR 變量含有當(dāng)前數(shù)據(jù)文件中已處理過(guò)的記錄數(shù),NR 變量則含有已處理過(guò)的記錄總數(shù)。讓我們看幾個(gè)例子來(lái)了解一下這個(gè)差別
在這個(gè)例子中,gawk程序的命令行定義了兩個(gè)輸入文件(兩次指定的是同樣的輸入文件)。這個(gè)腳本會(huì)打印第一個(gè)數(shù)據(jù)字段的值和 FNR 變量的當(dāng)前值。注意,當(dāng)gawk程序處理第二個(gè)數(shù)據(jù)文件時(shí), FNR 值被設(shè)回了 1 。
FNR 變量的值在 gawk 處理第二個(gè)數(shù)據(jù)文件時(shí)被重置了,而 NR 變量則在處理第二個(gè)數(shù)據(jù)文件時(shí)繼續(xù)計(jì)數(shù)。結(jié)果就是:如果只使用一個(gè)數(shù)據(jù)文件作為輸入, FNR 和 NR 的值是相同的;如果使用多個(gè)數(shù)據(jù)文件作為輸入, FNR 的值會(huì)在處理每個(gè)數(shù)據(jù)文件時(shí)被重置,而 NR 的值則會(huì)繼續(xù)計(jì)數(shù)直到處理完所有的數(shù)據(jù)文件。
6.2自定義變量
跟其他典型的編程語(yǔ)言一樣,gawk允許你定義自己的變量在程序代碼中使用。gawk自定義變量名可以是任意數(shù)目的字母、數(shù)字和下劃線,但不能以數(shù)字開(kāi)頭。重要的是,要記住 gawk 變量名區(qū)分大小寫(xiě)
1. 在腳本中給變量賦值
在gawk程序中給變量賦值跟在shell腳本中賦值類似,都用賦值語(yǔ)句
print 語(yǔ)句的輸出是 testing 變量的當(dāng)前值。跟shell腳本變量一樣, gawk 變量可以保存數(shù)值或文本值
在這個(gè)例子中, testing 變量的值從文本值變成了數(shù)值.賦值語(yǔ)句還可以包含數(shù)學(xué)算式來(lái)處理數(shù)字值:
2.在命令行上給變量賦值
也可以用 gawk 命令行來(lái)給程序中的變量賦值。這允許你在正常的代碼之外賦值,即時(shí)改變變量的值。下面的例子使用命令行變量來(lái)顯示文件中特定數(shù)據(jù)字段
這個(gè)特性可以讓你在不改變腳本代碼的情況下就能夠改變腳本的行為。第一個(gè)例子顯示了文件的第二個(gè)數(shù)據(jù)字段,第二個(gè)例子顯示了第三個(gè)數(shù)據(jù)字段,只要在命令行上設(shè)置 n 變量的值就行。使用命令行參數(shù)來(lái)定義變量值會(huì)有一個(gè)問(wèn)題。在你設(shè)置了變量后,這個(gè)值在代碼的 BEGIN 部分不可用。
可以用 -v 命令行參數(shù)來(lái)解決這個(gè)問(wèn)題。它允許你在 BEGIN 代碼之前設(shè)定變量。在命令行上,-v 命令行參數(shù)必須放在腳本代碼之前。
6.3 處理數(shù)組
1.定義數(shù)組變量
可以用標(biāo)準(zhǔn)賦值語(yǔ)句來(lái)定義數(shù)組變量。數(shù)組變量賦值的格式如下:
var[index] = element其中 var 是變量名, index 是關(guān)聯(lián)數(shù)組的索引值, element 是數(shù)據(jù)元素值。下面是一些gawk中數(shù)組變量的例子。在引用數(shù)組變量時(shí),必須包含索引值來(lái)提取相應(yīng)的數(shù)據(jù)元素值
在引用數(shù)組變量時(shí),會(huì)得到數(shù)據(jù)元素的值。數(shù)據(jù)元素值是數(shù)字值時(shí)也一樣:
2.遍歷數(shù)組變量
關(guān)聯(lián)數(shù)組變量的問(wèn)題在于你可能無(wú)法知曉索引值是什么。跟使用連續(xù)數(shù)字作為索引值的數(shù)字?jǐn)?shù)組不同,關(guān)聯(lián)數(shù)組的索引可以是任何東西。如果要在gawk中遍歷一個(gè)關(guān)聯(lián)數(shù)組,可以用 for 語(yǔ)句的一種特殊形式。
for (var in array) { statements }這個(gè) for 語(yǔ)句會(huì)在每次循環(huán)時(shí)將關(guān)聯(lián)數(shù)組 array 的下一個(gè)索引值賦給變量 var ,然后執(zhí)行一遍 statements 。重要的是記住這個(gè)變量中存儲(chǔ)的是索引值而不是數(shù)組元素值。可以將這個(gè)變量用作數(shù)組的索引,輕松地取出數(shù)據(jù)元素值。
注意:索引值不會(huì)按任何特定順序返回,但它們都能夠指向?qū)?yīng)的數(shù)據(jù)元素值。明白這點(diǎn)很重要,因?yàn)槟悴荒苤竿祷氐闹刀际怯泄潭ǖ捻樞?#xff0c;只能保證索引值和數(shù)據(jù)值是對(duì)應(yīng)的
3.刪除數(shù)組變量
從關(guān)聯(lián)數(shù)組中刪除數(shù)組索引要用一個(gè)特殊的命令
delete array[index]刪除命令會(huì)從數(shù)組中刪除關(guān)聯(lián)索引值和相關(guān)的數(shù)據(jù)元素值
6.4 使用模式
1.正則表達(dá)式
在使用正則表達(dá)式時(shí),正則表達(dá)式必須出現(xiàn)在它要控制的程序腳本的左花括號(hào)前。
正則表達(dá)式 /11/ 匹配了數(shù)據(jù)字段中含有字符串 11 的記錄。gawk程序會(huì)用正則表達(dá)式對(duì)記錄中所有的數(shù)據(jù)字段進(jìn)行匹配,包括字段分隔符。
2.匹配操作符
匹配操作符(matching operator)允許將正則表達(dá)式限定在記錄中的特定數(shù)據(jù)字段。匹配操作符是波浪線( ~ )。可以指定匹配操作符、數(shù)據(jù)字段變量以及要匹配的正則表達(dá)式.
$1 ~ /^data/$1 變量代表記錄中的第一個(gè)數(shù)據(jù)字段。這個(gè)表達(dá)式會(huì)過(guò)濾出第一個(gè)字段以文本 data 開(kāi)頭的所有記錄。下面是在gawk程序腳本中使用匹配操作符的例子。
匹配操作符會(huì)用正則表達(dá)式 /^data2/ 來(lái)比較第二個(gè)數(shù)據(jù)字段,該正則表達(dá)式指明字符串要以文本 data2 開(kāi)頭。并使用$0打印整行內(nèi)容.這可是件強(qiáng)大的工具,gawk程序腳本中經(jīng)常用它在數(shù)據(jù)文件中搜索特定的數(shù)據(jù)元素
這個(gè)例子會(huì)在第一個(gè)數(shù)據(jù)字段中查找文本 root。如果在記錄中找到了這個(gè)模式,它會(huì)打印該記錄的第一個(gè)和最后一個(gè)數(shù)據(jù)字段值。
你也可以用 ! 符號(hào)來(lái)排除正則表達(dá)式的匹配
$1 !~ /expression/如果記錄中沒(méi)有找到匹配正則表達(dá)式的文本,程序腳本就會(huì)作用到記錄數(shù)據(jù)
在這個(gè)例子中,gawk程序腳本會(huì)打印/etc/passwd文件中與用戶ID root不匹配的用戶ID和登錄shell。
3.數(shù)學(xué)表達(dá)式
除了正則表達(dá)式,你也可以在匹配模式中用數(shù)學(xué)表達(dá)式。這個(gè)功能在匹配數(shù)據(jù)字段中的數(shù)字值時(shí)非常方便。舉個(gè)例子,如果你想顯示所有屬于root用戶組(組ID為 0 )的系統(tǒng)用戶,可以用這個(gè)腳本。
gawk -F: '$4 == 0{print $1}' /etc/passwd這段腳本會(huì)查看第四個(gè)數(shù)據(jù)字段含有值 0 的記錄。在這個(gè)Linux系統(tǒng)中,有五個(gè)用戶賬戶屬于root用戶組。
可以使用任何常見(jiàn)的數(shù)學(xué)比較表達(dá)式:
- ?x == y :值x等于y。
- ?x <= y :值x小于等于y。
- ?x < y :值x小于y。
- ?x >= y :值x大于等于y。
- ?x > y :值x大于y。
也可以對(duì)文本數(shù)據(jù)使用表達(dá)式,但必須小心。跟正則表達(dá)式不同,表達(dá)式必須完全匹配。數(shù)據(jù)必須跟模式嚴(yán)格匹配
第一個(gè)測(cè)試沒(méi)有匹配任何記錄,因?yàn)榈谝粋€(gè)數(shù)據(jù)字段的值不在任何記錄中。第二個(gè)測(cè)試用值data11 匹配了一條記錄。
6.5 結(jié)構(gòu)化命令
1. if 語(yǔ)句
gawk編程語(yǔ)言支持標(biāo)準(zhǔn)的 if-then-else 格式的 if 語(yǔ)句。你必須為 if 語(yǔ)句定義一個(gè)求值的條件,并將其用圓括號(hào)括起來(lái)。如果條件求值為 TRUE ,緊跟在 if 語(yǔ)句后的語(yǔ)句會(huì)執(zhí)行。如果條件求值為 FALSE ,這條語(yǔ)句就會(huì)被跳過(guò)。可以用這種格式:
if (condition) statement1也可以將它放在一行上,像這樣:
if (condition) statement1如果需要在 if 語(yǔ)句中執(zhí)行多條語(yǔ)句,就必須用花括號(hào)將它們括起來(lái)。
gawk 的 if 語(yǔ)句也支持 else 子句,允許在 if 語(yǔ)句條件不成立的情況下執(zhí)行一條或多條語(yǔ)句。這里有個(gè)使用 else 子句的例子
可以在單行上使用 else 子句,但必須在 if 語(yǔ)句部分之后使用分號(hào)
if (condition) statement1; else statement2以下是上一個(gè)例子的單行格式版本:
2.while 語(yǔ)句
while 語(yǔ)句為gawk程序提供了一個(gè)基本的循環(huán)功能。下面是 while 語(yǔ)句的格式:
while (condition) { statements }while 循環(huán)允許遍歷一組數(shù)據(jù),并檢查迭代的結(jié)束條件。如果在計(jì)算中必須使用每條記錄中的多個(gè)數(shù)據(jù)值,這個(gè)功能能幫得上忙。
while 語(yǔ)句會(huì)遍歷記錄中的數(shù)據(jù)字段,將每個(gè)值都加到 total 變量上,并將計(jì)數(shù)器變量 i 增值。當(dāng)計(jì)數(shù)器值等于 4 時(shí), while 的條件變成了 FALSE ,循環(huán)結(jié)束,然后執(zhí)行腳本中的下一條語(yǔ)句。這條語(yǔ)句會(huì)計(jì)算并打印出平均值。這個(gè)過(guò)程會(huì)在數(shù)據(jù)文件中的每條記錄上不斷重復(fù)
gawk編程語(yǔ)言支持在 while 循環(huán)中使用 break 語(yǔ)句和 continue 語(yǔ)句,允許你從循環(huán)中跳出。
break 語(yǔ)句用來(lái)在 i 變量的值為 2 時(shí)從 while 循環(huán)中跳出。do-while語(yǔ)句使用較少,在此不介紹。
3.for語(yǔ)句
for 語(yǔ)句是許多編程語(yǔ)言執(zhí)行循環(huán)的常見(jiàn)方法。gawk編程語(yǔ)言支持C風(fēng)格的 for 循環(huán)。
for( variable assignment; condition; iteration process)6.6 格式化打印
本文不做說(shuō)明
6.7 內(nèi)建函數(shù)
1.數(shù)學(xué)函數(shù)
在使用一些數(shù)學(xué)函數(shù)時(shí)要小心,因?yàn)間awk語(yǔ)言對(duì)于它能夠處理的數(shù)值有一個(gè)限定區(qū)間。如果超出了這個(gè)區(qū)間,就會(huì)得到一條錯(cuò)誤消息
第一個(gè)例子會(huì)計(jì)算e的100次冪,雖然數(shù)值很大,但尚在系統(tǒng)的區(qū)間內(nèi)。第二個(gè)例子嘗試計(jì)算e的1000次冪,已經(jīng)超出了系統(tǒng)的數(shù)值區(qū)間,所以就生成了一條錯(cuò)誤消息。
除了標(biāo)準(zhǔn)數(shù)學(xué)函數(shù)外,gawk還支持一些按位操作數(shù)據(jù)的函數(shù)。
- and(v1, v2) :執(zhí)行值 v1 和 v2 的按位與運(yùn)算。
- compl(val) :執(zhí)行 val 的補(bǔ)運(yùn)算。
- lshift(val, count) :將值 val 左移 count 位。
- or(v1, v2) :執(zhí)行值 v1 和 v2 的按位或運(yùn)算。
- rshift(val, count) :將值 val 右移 count 位。
- xor(v1, v2) :執(zhí)行值 v1 和 v2 的按位異或運(yùn)算
2.字符串函數(shù)
gawk編程語(yǔ)言還提供了一些可用來(lái)處理字符串值的函數(shù):
3. 時(shí)間函數(shù)
gawk編程語(yǔ)言包含一些函數(shù)來(lái)幫助處理時(shí)間值:
時(shí)間函數(shù)常用來(lái)處理日志文件,而日志文件則常含有需要進(jìn)行比較的日期。通過(guò)將日期的文本表示形式轉(zhuǎn)換成epoch時(shí)間(自1970-01-01 00:00:00 UTC到現(xiàn)在的秒數(shù)),可以輕松地比較日期。
下面是在gawk程序中使用時(shí)間函數(shù)的例子。
該例用 systime 函數(shù)從系統(tǒng)獲取當(dāng)前的epoch時(shí)間戳,然后用 strftime 函數(shù)將它轉(zhuǎn)換成用戶可讀的格式,轉(zhuǎn)換過(guò)程中使用了shell命令 date 的日期格式化字符。
4.自定義函數(shù)
本文不做說(shuō)明。
7.實(shí)例
舉例來(lái)說(shuō),我們手邊有一個(gè)數(shù)據(jù)文件,其中包含了兩支隊(duì)伍(每隊(duì)兩名選手)的保齡球比賽得分情況
每位選手都有三場(chǎng)比賽的成績(jī),這些成績(jī)都保存在數(shù)據(jù)文件中,每位選手由位于第二列的隊(duì)名來(lái)標(biāo)識(shí)。下面的腳本對(duì)每隊(duì)的成績(jī)進(jìn)行了排序,并計(jì)算了總分和平均分。
#!/bin/bash for team in $(gawk -F, '{print $2}' scores.txt | uniq) dogawk -v team=$team 'BEGIN{FS=",";total=0}{if ($2==team){total += $3 + $4 + $5;}}END {avg = total / 6;print "Total for", team, "is", total, ",the average is",avg}' scores.txt donefor 循環(huán)中的第一條語(yǔ)句過(guò)濾出數(shù)據(jù)文件中的隊(duì)名,然后使用 uniq 命令返回不重復(fù)的隊(duì)名。for 循環(huán)再對(duì)每個(gè)隊(duì)進(jìn)行迭代。for 循環(huán)內(nèi)部的 gawk 語(yǔ)句進(jìn)行計(jì)算操作。對(duì)于每一條記錄,首先確定隊(duì)名是否和正在進(jìn)行循環(huán)的隊(duì)名相符。這是通過(guò)利用 gawk 的 -v 選項(xiàng)來(lái)實(shí)現(xiàn)的,該選項(xiàng)允許我們?cè)趃awk程序中傳遞shell變量。如果隊(duì)名相符,代碼會(huì)對(duì)數(shù)據(jù)記錄中的三場(chǎng)比賽得分求和,然后將每條記錄的值再相加,只要數(shù)據(jù)記錄屬于同一隊(duì)。
在循環(huán)迭代的結(jié)尾處,gawk代碼會(huì)顯示出總分以及平均分。輸出結(jié)果如下。
其中for循環(huán)的變量定義還有另外一種方式:
#!/bin/bash teams=$(gawk -F, '{print $2}' scores.txt | uniq) for team in ${teams[@]} dogawk -v team=$team 'BEGIN{FS=",";total=0}{if ($2==team){total += $3 + $4 + $5;}}END {avg = total / 6;print "Total for", team, "is", total, ",the average is",avg}' scores.txt done輸出的結(jié)果也是一樣的。
參考書(shū)籍:Linux命令行與shell腳本編程大全.第3版.pdf
總結(jié)
以上是生活随笔為你收集整理的linux的gawk命令的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: vscode中文插件失效解决方法
- 下一篇: 深圳云计算培训:一个全新的世界—Linu