Windows上GAWK的使用(一)
???現(xiàn)在經(jīng)常要處理到一些日志數(shù)據(jù),對這些數(shù)據(jù)進行分析處理,但首先要對日志數(shù)據(jù)進行etl處理,如果簡單的數(shù)據(jù)格式處理,使用gawk是最理想不過了,下面我們就介紹如何使用gawk,對數(shù)據(jù)進行e(extract)處理。
?
一.到網(wǎng)上下載一個gawk.exe程序(用于Windows上)。
二.gawk的基本語法.
?
1.gawk格式.
gawk [options] "[Begin{}][pattern]{action}[End{}]" InputFileName.
?
1.1. 命令選項[options]
-F fs or --field-separator fs
指定輸入文件折分隔符,fs是一個字符串或者是一個正則表達(dá)式,如-F:。
-v var=value or --asign var=value
賦值一個用戶定義變量。
-f scripfile or --file scriptfile
從腳本文件中讀取awk命令。
-mf nnn and -mr nnn
對nnn值設(shè)置內(nèi)在限制,-mf選項限制分配給nnn的最大塊數(shù)目;-mr選項限制記錄的最大數(shù)目。這兩個功能是Bell實驗室版awk的擴展功能,在標(biāo)準(zhǔn)awk中不適用。
-W compact or --compat, -W traditional or --traditional
在兼容模式下運行awk。所以gawk的行為和標(biāo)準(zhǔn)的awk完全一樣,所有的awk擴展都被忽略。
-W copyleft or --copyleft, -W copyright or --copyright
打印簡短的版權(quán)信息。
-W help or --help, -W usage or --usage
打印全部awk選項和每個選項的簡短說明。
-W lint or --lint
打印不能向傳統(tǒng)unix平臺移植的結(jié)構(gòu)的警告。
-W lint-old or --lint-old
打印關(guān)于不能向傳統(tǒng)unix平臺移植的結(jié)構(gòu)的警告。
-W posix
打開兼容模式。但有以下限制,不識別:\x、函數(shù)關(guān)鍵字、func、換碼序列以及當(dāng)fs是一個空格時,將新行作為一個域分隔符;操作符**和**=不能代替^和^=;fflush無效。
-W re-interval or --re-inerval
允許間隔正則表達(dá)式的使用,參考(grep中的Posix字符類),如括號表達(dá)式[[:alpha:]]。
-W source program-text or --source program-text
使用program-text作為源代碼,可與-f命令混用。
-W version or --version
打印bug報告信息的版本。
3. 模式和操作[pattern] And [action]
gawk腳本是由模式和操作組成的:
pattern {action} 如gawk .exe “/root/” ?test.text,或gawk.exe ?“$3 < 100” ?test.text。
兩者是可選的,如果沒有模式,則action應(yīng)用到全部記錄,如果沒有action,則輸出匹配全部記錄。默認(rèn)情況下,每一個輸入行都是一條記錄,但用戶可通過RS變量指定不同的分隔符進行分隔。
3.1. 模式
模式可以是以下任意一個:
*
/正則表達(dá)式/:使用通配符的擴展集。
*
關(guān)系表達(dá)式:可以用下面運算符表中的關(guān)系運算符進行操作,可以是字符串或數(shù)字的比較,如$2>%1選擇第二個字段比第一個字段長的行。
*
模式匹配表達(dá)式:用運算符~(匹配)和~!(不匹配)。
*
模式,模式:指定一個行的范圍。該語法不能包括BEGIN和END模式。
*
BEGIN:讓用戶指定在第一條輸入記錄被處理之前所發(fā)生的動作,通常可在這里設(shè)置全局變量。
*
END:讓用戶在最后一條輸入記錄被讀取之后發(fā)生的動作。
3.2. 操作[action]
操作由一人或多個命令、函數(shù)、表達(dá)式組成,之間由換行符或分號隔開,并位于大括號內(nèi)。主要有四部份:
*變量或數(shù)組賦值
*輸出命令
*內(nèi)置函數(shù)
*控制流命令
???gawk逐行讀取InputFileName文件的內(nèi)容,將符合pattern規(guī)則的行,再按照action指定的操作來執(zhí)行,pattern相當(dāng)于是條件,action相當(dāng)于是執(zhí)行動作。其中用[]中括號括起來的部分不是必須寫的部分,接下來列舉一個簡單的例子.
test.txt文件中的內(nèi)容如下:
1111;aaaa;AAAA;
2222;bbbb;BBBB;
3333;cccc;dddd;
在命令窗口運行:gawk.exe "{print $0}" test.txt,則輸出以下內(nèi)容:
1111;aaaa;AAAA;
2222;bbbb;BBBB;
3333;cccc;dddd;
"{print $0}"表示完整的輸出從test.txt文件中讀取的每一行.$0表示當(dāng)前讀取的行,從這里我們應(yīng)該知道gawk從test.txt讀取一行之后開始執(zhí)行action塊的動作。為了驗證這點,下面再舉一個例子:
gawk.exe "{print """test"""}" test.txt 輸出如下:
test
test
test
由于test.txt文件中有三行,所以action塊部分執(zhí)行了三次.
?
如果想以分號作為分隔符可以將test.txt分成四列,只輸出前兩列:
gawk.exe -F"\73"?"{print $1,$2}" test.txt 注意這里"\73"是分號的八進制Ascii碼。輸出如下:
1111 aaaa
2222 bbbb
3333 cccc
我們發(fā)現(xiàn)輸出的結(jié)果中每一列是用空格分隔的,現(xiàn)在我們自己定義分隔符,寫法如下:
gawk.exe?-F"\73"?"BEGIN{OFS="""\t"""}{print $1,$2}" test.txt 輸出結(jié)果中每一列是用制表符來分割的,這里面使用到了BEGIN{}塊,和內(nèi)建變量OFS,BEGIN塊的作用就是在gawk開始讀取test.txt第一行之前要執(zhí)行的部分,一般在BEGIN塊里面初始化變量,OFS是gawk內(nèi)建變量,表示輸出列的分割符是什么,這里使用的是制表符.
總結(jié)
以上是生活随笔為你收集整理的Windows上GAWK的使用(一)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 5G网络正式商用对4G物联网卡造成何种影
- 下一篇: Java物品清单结算