本文整體佈局,按照sed和awk第二版的重點來,算是學習筆記吧!
小記:前兩篇章是自己總結的,可以先了解下,本文不打算按部就班的講,以前面兩節爲知識鋪墊!
核心:掌握awk的規則
awk是一門解釋性(程序設計)語言,本文從打印Hello Awk開始
(1)需求:打印 Hello Awk
# 細細體會這種寫法-->雙引號包含單引號
awk 'BEGIN{print "'$var'"}'
test
小知識點
#(1)echo -e激活轉義字符,使用-e選項時,若出現某些特殊字符,則特別加以處理,而不會將它當成一般文字輸出
#(2)當awk中print語句沒有參數,只是簡單輸出每個輸入行
#(3)運行原理:對於文本中的每一行(作爲對象),用{pattern}進行匹配,如果匹配就對該行進行{action}
#(4)BEGIN:BEGIN模式用於指定在第一個輸入行讀入之前要執行動作,可以只有BEGIN模式,沒有其它語句,此時awk將不處理任何輸入文件
(2)awk是輸入驅動的
#(1):每次輸入之後都需要按RETURN鍵
#(2):結束的時候可以按CTRL-D鍵盤
(3)awk的設計模型
'BEGIN':在任何輸入'被讀取前'執行的例程-->常用來做'初始化'
'中間':讀入每個輸入行時('一次讀入一行')執行第二個例程(主輸入循環)
'END':在所有的'輸入完成後'(全部文件內容)執行第三個例程-->常做'統計收尾'
牢記:每個模式/操作過程位於主輸入循環中個,且負責讀取輸入行;所編寫的過程將應用於每個輸入行,而且一次一行
(4)模式匹配初涉
pattern:顧名思義是符合標準,自然而然涉及到了正則表達式
原理:當awk讀入一輸入行時,它試圖匹配腳本中的每個模式匹配規則,只有與一個特定模式匹配的輸入行才能稱之爲操作對象
awk的正則表達式是屬於:擴展的正則表達式
經典的模式
'空行': /^$/
'整數':/[0-9]+/
awk '/[0-9]+/{print}' file
特殊:一行匹配多個規則
注意:輸入4T被標識即是整數,又是字符串,即一行匹配多個規則,一般要防止一行與多個規則匹配!
說明:pattern1處理之後,pattern2日仍是原模式空間的改行匹配,而不是pattern1處理後的結果pattern2再處理
補充:awk腳本的註釋也是#
(5)記錄(Record)和字段(Field)
awk假設輸入是有結構(可識別的結構化數據),這種結構不一定是一眼能看出來的!
記錄:文件的每個輸入行作爲一條記錄
字段:由分割符(默認是空格和製表符)分割的單詞作爲字段
分隔符(Separation):用來分割字段的字
(6)字段的引用(quote)和分離
awk允許'字段操作符$'來指定字段
'$0':表示整個輸入記錄
'$1':表示第一個字段,其他依次類推
(7)逗號變空格
說明:print語句中分割每個參數的逗號使得輸出(OFS原因)各值之間有一個空格!
腳本形式
備註:改變輸出用OFS即可!
BEGIN指定'相關分割符'最好以""分割
(8)數值計算和變量初次涉及
echo a b c | awk 'BEGIN{one=1;two=2}{print $(one+two)}'
# $n,n不一定要用整數,也可以用變量值代替
# 說明1-->第一部分:echo a b c 表示awk讀入一行,可以用''引起來
# 說明2-->第二部分:BEGIN做文件讀入前的初始化,print $(one+two)打印print $3即該記錄的第三個字段
(9)~ 操作符
說明:(~)操作符測試一個字段的正則表達式
補充
awk -v FS=':' '$3 ~ /^male$/{print $0}' test
wzj:18:male
wzj2:22:male
後記:關於寫不寫博客,糾結了很長時間,一方面太耗費精力,另一方面時間也不太允許,所幸經過掙扎,重新迴歸,希望大家多多批評,多多提問題,一塊進步!