正所謂,知己知彼百戰不殆,想要拿下awk,必需瞭解它的前世今生;
一、它可以做什麼
1、 awk 是一種編程語言, 可以用作linux或者Unix的bash腳本中;也可以單獨放在一個文件中,通過awk命令解釋器運行;
【這裏只關注awk用作bash腳本中】
2、awk 主要功能是,基於指定的規則,對文本或者數據做瀏覽和提取操作; 其處理原則爲:逐行掃描文件,從第一行到最後一行,尋找匹配指定規則的內容。 【awk命令的主要功能是對文本做提取操作,所以,bash腳本編寫中,awk經常與其它指令聯合是使用:通過awk提取指定行,然後對該行做你所需要的操作。
二、它怎麼使用呢
1、語法結構
awk 選項 '命令部分' 文件名
【基本的awk 指令語法構成就是如上所示,也有一些更高階的操作,這個後續再學習】
2、一些基本概念 【寫在前面的東西】
1)分隔符和域
分隔符,就是語法結構中的『選項』部分, awk指令中,通過 -F 來定義字段的分隔符; awk指令默認的分隔符爲空格,如果要處理的文件時以空格分割,則無需指定選項 -F ; 如果是通過除空格之外的其它字符分割,則必需指定-F ;
域: 定義了分隔符,則比如會有文本被分割成一段一段的, 這裏統稱爲域; 域的標記符爲:$1, $2, $3 ... $n ; 其中,$0 表示所有的域;
一個栗子:【遺留一個問題, 如果實現tab鍵分割,後續學習後,再補充】
定義文件【文件包含多列,列之間通過逗號分割】:
vim 1
序號,姓名,年齡,職業$
1,張三,19,學生$
2,李四,25,程序員$
3,王五,40,教師$
awk -F , '{print $0}' 1
輸出結果爲:
序號,姓名,年齡,職業
1,張三,19,學生
2,李四,25,程序員
3,王五,40,教師
#解析: -F 定義分隔符爲逗號; 如果是以其它字符分割,則直接更換即可;
$0 定義域,這裏輸出全部域; 【可以通過域標識符,更換輸出的域, 比如$1, 則只輸出第一列】
1 爲我定義的文件名字;
2)模式和動作
他們說,awk語句,是由『模式』和『動作』兩部分組成的;那麼什麼是模式,什麼是動作呢?
動作:就是,定義對數據的具體操作;【也就是一些列的操作指令】;
模式:則定義了『動作』被觸發的條件;
【可以是條件語句、正則匹配、複合語句等】;
【當然了,這並非必需的,若沒有定義模式,則動作將保持時刻被觸發的狀態】
【模式以關鍵詞BEGIN和END來標識, 其中BEGIN 定義在 動作之前執行; END定義的內容則在動作之後執行】
一個栗子:
還是文件: 1;
執行如下指令:
$ awk -F , 'BEGIN {print "---start print the file---"} {print $2} END {print "---the end---"}' 1
輸出結果爲:
---start print the file---
姓名
張三
李四
王五
---the end---
#解析:
1、-F: 定義分隔符,不做解釋;
2、'BEGIN {print "---start print the file---"} {print $2} END {print "---the end---"}' 爲模式定義和動作定義; 單引號不能省略;
1)其中 BEGIN {print "---start print the file---"} 定義動作開始前執行的操作;
2){print $2} 爲動作定義;
3) END {print "---the end---"}' 定義動作結束後執行的操作;
4)每一個操作,需要{};