5,gawk實用程式
什麼是awk,什麼是nawk,什麼是gawk?
Awk是linux/unix下的用來操縱資料和產生報告的程式語言。Nawk是新的版本,gawk是gnu版本。資料可以來自標準輸入,一個或者多個檔案,或者其他命令的輸出。Awk可用於命令列的簡單操作,也可以寫入大的應用程式。因為awk可以操縱書籍,所以它是shell教本和管理小型資料庫中必須的工具。
Awk逐行掃描檔案,從第一行到最後一行,尋找匹配特定模組的行,並在這些行上執行“選擇”動作。如果一個模組沒有指定動作,這些配置的行就被顯示在螢幕上。如果一個動作沒有模板,所有被動作指定的行被處理。
Gawk是gun awk程式語言工程的成果。
本章內容基於gawk
awk的格式
一個awk程式包括awk命令,程式結構,引用(或輸入檔案)和輸入檔案的名字。如果輸入檔案沒有被指定,輸入就來自標準輸入或鍵盤。
Awk結構由模板,動作或者模板和動作聯合組成。模板是由某種型別表示式的說明組成。如果沒有看見關鍵字if,但是你在評價表示式的時候想到了單詞if,這就是模板。動作是在大括號內被分號或者新的一行封的一個和多個說明。模板不能夠放在大括號中,由在斜槓中間的正規表示式和awk提供的操作中的一個或者幾個組成。
Awk命令可以從命令列中輸入,也可以從awk指令碼中輸入。輸入行可以來自檔案,管道和標準輸入。
命令格式:從檔案輸入
awk ‘pattern’ filename
awk ‘{action}’ filename
awk ‘pattern {action}’ filename
命令格式:從命令輸入
command | awk ‘pattern’
command | awk ‘{action}’
command | awk ‘pattern {action}’
例子:
[posftp@SZTrade posftp]$ df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda6 50394964 14237672 33597336 30% /
/dev/sda3 101107 16228 79658 17% /boot
none 3991708 0 3991708 0% /dev/shm
tmpfs 1048576 1024000 24576 98% /informix.links/SZTrade/tmpfs
[posftp@SZTrade posftp]$ df | awk '$4>75000'
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda6 50394964 14237784 33597224 30% /
/dev/sda3 101107 16228 79658 17% /boot
none 3991708 0 3991708 0% /dev/shm
[posftp@SZTrade posftp]$
df報告檔案系統中的剩餘空間。Df 命令輸出透過管道傳送給awk。如果第四個域中的塊多於75000,則列印該行。
Awk命令列選項
Awk由很多的命令列選項。Gawk有兩種命令列選項格式:Gun長格式以雙橫線開始(--),後面緊跟著一個單詞;短的傳統POSIX格式,由一個橫線和一個字母組成。Grep使用-W選項或者相應的長格式。任何提供給長選項的引數貨殖用=連線(中間沒有空格),或者在下一命令列的引數內提供。
[posftp@SZTrade posftp]$ awk -help
Usage: awk [POSIX or GNU style options] -f progfile [--] file ...
Usage: awk [POSIX or GNU style options] [--] 'program' file ...
POSIX options: GNU long options:
-f progfile --file=progfile
-F fs --field-separator=fs
-v var=val --assign=var=val
-m[fr] val
-W compat --compat
-W copyleft --copyleft
-W copyright --copyright
-W dump-variables[=file] --dump-variables[=file]
-W gen-po --gen-po
-W help --help
-W lint[=fatal] --lint[=fatal]
-W lint-old --lint-old
-W non-decimal-data --non-decimal-data
-W profile[=file] --profile[=file]
-W posix --posix
-W re-interval --re-interval
-W source=program-text --source=program-text
-W traditional --traditional
-W usage --usage
-W version --version
To report bugs, see node `Bugs' in `gawk.info', which is
section `Reporting Problems and Bugs' in the printed version.
gawk is a pattern scanning and processing language.
By default it reads standard input and writes standard output.
Examples:
gawk '{ sum += $1 }; END { print sum }' file
gawk -F: '{ print $1 }' /etc/passwd
[posftp@SZTrade posftp]$
經常用的gawk命令列選項
-F fs 指定輸入檔案的分隔符,fs式一個字串貨殖一個正規表示式
-v var=value, 賦值一個使用者定義的變數,執行在awk指令碼前var,這樣在BEGIN塊中的變數就是合法的了。
-f scriptfile 從指令碼檔案中讀取awk命令。
格式輸出
列印函式
awk命令的動作部分式在小括號內的。如果沒有指定動作並且有模板被匹配,awk就執行預設動作,將所有匹配的行列印到螢幕。Print函式用來列印簡單且不需要特殊格式的輸出。要列印更為複雜和精確的格式,就需要使用printf和sprintf函式了。
Print函式也可以直接用在awk命令的動作部分(print).print函式的引數可以是變數,數值或者字串。字串必須用雙引號引用,引數用逗號封。如果沒有逗號,引數就串連在一起而無法區分。
[posftp@SZTrade posftp]$ date
Tue Aug 8 14:43:54 CST 2006
[posftp@SZTrade posftp]$ date | awk '{print "month: " $2 "nYear: ",$6}'
month: Aug
Year: 2006
[posftp@SZTrade posftp]$
linux的date命令輸出透過管道給awk。字串month:被列印,後面跟著換行符“n”的秒域和Year:最後是第六域($6).
換碼序列。換碼序列表現為一個反斜槓後面緊跟著一個字母或者數字。他們被用在字串中表示空格,新行及換頁等等
換碼序列 | 含義 |
b | Backspace |
f | 換頁 |
n | 新行 |
r | 回車 |
t | 製表符 |
47 | 十進位制47,表示單引號 |
c | C表示其他任何字元 |
Awk ‘/Sally/{print “ttHave a nice day, “ $1,$2 “!!”}’ employees
如果某行包含模板Sally,print函式就列印兩個製表符,字串Have a nice day,第一個域(用$1表示)和第二個域(用$2表示)後面緊跟著一個包含靈感感嘆號的字串。
OFMT變數
在列印數字的時候你也許想控制數字的格式,我們通常用printf來完成這個功能。Awk的特殊變數OFMT也可以在使用print函式的時候,控制數字的列印格式。它的預設值是“%。6g”----小數點後面6位將被列印
[posftp@SZTrade posftp]$ awk 'BEGIN{OFMT="%.2f"; print 1.2456789,12E-2}'
1.25 0.12
[posftp@SZTrade posftp]$
OFMT變數被設定為浮點數(f)的小數點後面兩位被列印。百分號(%)用來說明指定的格式。
Printf函式
Printf函式返回一個列印到螢幕的格式化好的字串,就像c語言中關於printf的說明。Printf函式由被引用的控制字串組成,這個控制字串可以嵌入指定格式和改變數。控制字串緊跟著一個逗號和一串由逗號分割的表示式,這些表示式將按照控制字串指定的形式被格式化。跟print函式不同,printf函式不提供換行符,如果需要換行就必須寫換碼序列,n.
轉換字元
轉換字元 | 定義 |
c | 字元 |
s | 字串 |
d | 十進位制數 |
ld | 長十進位制數 |
u | 無正負的十進位制數 |
lu | 長的無正負之分的十進位制數 |
x | 十六進位制數 |
lx | 長十六進位制數 |
o | 八進位制數 |
lo | 長八進位制數 |
e | 用科學計數法記錄的浮點數 |
f | 浮點數 |
g | 使用e 或者 f函式處理過的浮點數,佔用最少的空間 |
Printf修正符
字元 | 定義 |
- | 左對齊 |
# | 顯示八進位制數的時候以0開頭;顯示十六進位制數的時候以0x開頭 |
+ | 使用d,e,f或者g轉換一行,數字前面保持+或者- |
0 | 用0代替空格填補空白 |
格式化說明符
Printf格式化說明符 | 功能 (假設 x=A y=15 z=23. $1=Bob Smith) |
%c | 列印單個ASCII字元 printf(“The character is %cn”,x)結果為:The character is A |
%d | 列印十進位制數 printf(“The boy is $d year oldn”,y)結果為:The boy is 15 year old |
%e | 列印用科學計數法表示的數 printf(“z is %en”,z)結果為:z is 2.3e+01 |
%f | 打浮點數 printf(“z is %fn”,2.3*2)結果為:z is 4.600000 |
%o | 列印八進位制數 printf(“y is %on”,y)結果為:y is 17 |
%s | 列印字串 printf(“The name of the culprit is %sn”,$1)結果為:The name of the culprit is Bob Smith |
%x | 列印十六進位制數 printf(“y is %xn”,y)結果為:y is f |
5.5記錄和域
5.5.1記錄
awk並不是把輸入檔案當作一個沒有終止的字串,而是看作具有一定格式和結構的。預設每一個以換行符結束的行稱做一個記錄。
記錄分割符。預設輸入和輸出的分隔符都是回車,儲存在awk內建變數ORS和RS中,ORS和RS的值可以在有限的範圍內修改。
$0變數。在awk中$0指的是整條記錄(當發生替換或者賦值而使得$0的值發生改變時,NF的值和域的個數都會跟著發生變化)。換行符的值儲存在awk內建變數RS中,預設情況下回車。
變數NR。多個記錄的每一條都儲存在內建變數NR中。每處理完一個記錄,NR的值就增加1。
5.5.2 域
記錄中的每一個單詞稱為“域”,預設情況下以空格或者tab分割。每一個單詞叫做一個域,awk跟蹤域的數量,並在內建變數NF中儲存這個數字。每一行的域的個數是不一樣的。典型限制為每行100個。
5.5.3 域分割符
輸入域分割符。Awk的內建變數FS儲存輸入域分割符的值。預設值是空格或者tab.可以在BEGIN語句中或者命令列上修改FS的值。
在命令列上修改域分割符。awk命令後面加上-F選項可以用來修改輸入檔案的域分割符。在-F後面的字串立刻就變成新的域分割符。包含元字串可以重新設定多個域分隔符。
使用多個域分割符。可以指定多個輸入分隔符,若域分隔符由多個字元組成,如FS,則該字串是一個放在方括號內的正規表示式。
例子:awk –F ‘ [ :t]’ ‘{print $1,$2,$3}’ employees2
輸出域分割符。預設的輸出分隔符是一個空格,儲存在awk內建變數OFS中。
5.6 模式與動作
5.6.1 模式
awk模式控制awk對輸入的檔案行所做的動作,一個模式包含正規表示式,條件表示式,或者二者的結合。當條件表示式為真的時候,預設動作是列印該行。當讀取一個模式表示式時,可以使用if語句。使用if時不需要花括號引用。這裡的if變成一個動作語句,語法結果發生了變化。
5.6.2 動作
花括號內的,用分號分割的語句稱為動作。如果模式在動作前面,模式決定什麼時候發出動作。動作可以是一個語句也可以是一組語句。語句之間用分號分割,也可以用換行符。
5.7 正規表示式
對於awk來說,正規表示式就是由斜槓之間的字元組成的模式。Awk支援用正規表示式元字元修改正規表示式。如果輸入行的字串匹配正規表示式,結果條件為真,則執行所有與模式捆綁在一起的動作,如果正規表示式被匹配但是沒有指定任何動作,則只列印該記錄。
5.8 指令碼檔案中的awk命令
當你有多個awk的模式/動作語句的時候,最簡單的辦法就是把它們放在一個指令碼檔案中。指令碼檔案是一個包含awk註釋和語句的檔案。如果語句和動作在同一行,則必須分號分割。若在不同的行則無需使用分號了。如果模式後面是動作,左花括號就必須與模式在同一行。註釋由#引導。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/312079/viewspace-245426/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 7.gawk功能:gawk程式設計程式設計
- Gartner預測:5年5億新應用,65%應用程式將透過低程式碼實現!
- 分享10段實用的HTML5程式碼HTML
- 實驗5 C語言指標應用程式設計C語言指標程式設計
- dbschema實用程式
- oncheck實用程式
- [實踐] xcp實用程式
- 用最少的程式碼手工實現一個Promise,5分鐘看懂Promise
- 機器學習程式碼實現 SVM (5)機器學習
- HTML5 應用程式快取HTML快取
- 5個開源聊天應用程式
- swift學習筆記《5》- 實用Swift筆記
- 5-監督者和應用程式
- 用低程式碼平臺,5分鐘實現報價轉訂單功能
- 5 分鐘掌握 JavaScript 實用竅門JavaScript
- oracle實用sql(5)--session相關資訊OracleSQLSession
- 《linux命令列與shell指令碼程式設計大全》第三版 - 核心筆記(3/4):sed和gawkLinux命令列指令碼程式設計筆記
- 實用JS程式碼大全JS
- HTML5 應用程式快取簡介HTML快取
- 5G應用的實時決策
- Pandas 資料分析 5 個實用小技巧
- 8款實用HTML5開發框架HTML框架
- 分享5款有趣又實用的軟體
- 別再自己摳圖了,Python用5行程式碼實現批量摳圖Python行程
- 用Python程式碼實現5種最好的、簡單的資料視覺化!Python視覺化
- 將Ext JS 5應用程式匯入Web專案以及實現本地化薦JSWeb
- 實驗5 迴圈結構程式設計(while、do-while語句的應用)程式設計While
- 實驗5迴圈結構程式設計(while、do-while語句的應用)程式設計While
- 炫酷實用 7款jQuery/HTML5圖片應用jQueryHTML
- 炫酷實用的HTML5應用和jQuery外掛HTMLjQuery
- GeneralUpdate實現應用程式更新
- c語言實用小程式C語言
- HTML5應用程式快取Application CacheHTML快取APP
- 工作中5個實用的Linux命令Linux
- 用pytorch實現LeNet-5網路PyTorch
- 低程式碼應用程式開發平臺的5種選擇
- 10個經典實用的HTML5圖表動畫應用HTML動畫
- 10款絢麗實用的HTML5圖表動畫應用HTML動畫