awk是一種處理文字資料的程式語言,它的設計使它非常適合於處理由行和列組成的文字資料。
1 基本語法
awk pattern
以上語法表示當某個文字行符合pattern指定的匹配規則時,執行actions所執行的操作。
兩者必須保證有乙個,如果省略pattern則表示對所有的文字行執行actions所表示的操作,如果省略actions表示將匹配成功的行輸出到螢幕。
awk的匹配模式非常靈活,可以是一下任意一種:
正規表示式
關係表示式:如x>34
模式1 模式2
begin
endawk命令的操作由乙個或多個命令、函式或者表示式組成,他們之間由換行符或者分號隔開,並且位於大括號內,通常有四種操作:
變數或者陣列賦值
輸出命令
內建函式
流程控制語句
注:awk命令的語法隱含乙個條件結構,即如果符合匹配規則,則執行後面的操作。
2 awk工作流程
通過命令列:awk 'program-test' datafile
eg. awk '' scores.txt
通過awk指令碼:awk -f program-file file...
eg. awk -f 1.awk scores.txt
注:awk指令碼中不能含有除awk語句之外的其他命令或者語句
通過可執行檔案
3 awk的模式匹配
關係表示式:
awk '$2 > 80 ' scores.txt // 第二列成績超過80分
正規表示式:
放在兩條斜線之間:/regular_expression/
awk '/^(tom|kon)/ ' scores.txt
混合模式:
支援使用邏輯運算子&& || !
awk '/^k/ && $2 > 80 ' score.txt
區間模式:可以匹配一段連續的文字行
pattern1,pattern2
awk '/^nancy/, $2==92 ' scores.txt
//輸出包含匹配前後兩個模式在內的文字行之間的所有行
begin模式:
成立的時機為awk程式剛開始執行,但是又尚未讀取任何資料之前,該模式對應的操作僅僅被執行一次,當awk讀取資料之後,begin模式便不再成立。
#! /bin/awk -f
begin
end模式:
在awk命令處理完所有資料,即將退出程式時成立。
end
4 變數
awk的變數名只能包括字母 數字 下劃線,並且不能以數字開頭,區分大小寫。
awk中的變數型別分為兩種,分別為字串和數值。如果沒有指定值,數值型別的變數預設值為0,字串型別預設為空串。
begin
5 系統內建變數
$0:表示awk正在處理的記錄
$n:當前記錄的第n個字段的值
nf:當前記錄的字段數
nr:表示已經讀取的記錄的數量
fs:用來表示字段分隔符,使用者可以使用fs變數自定義當前資料檔案的字段分隔符,awk會在處理檔案資料前參考該變數的值來分隔記錄中的各個字段。
rs:自定義資料檔案中記錄的分隔符,預設為換行符\n。
注:awk會在讀取資料行之前通過fs及rs確定記錄和字段的分隔符,然後進行記錄和字段的分隔符,然後進行記錄和字段的分隔。每讀取一條記錄之後,變數$0 $1 $2等變數都會自動更新。
6 記錄分隔符和字段分隔符
指定記錄分隔符:
eg1.
begin
注:當將記錄分隔符指定為空字串時,awk會將多個連續的空白行看做乙個單一的記錄分隔符,也就是說,awk不會再將空白行作為一條空白記錄。另外,awk也會忽略檔案開頭和末尾處的空行。
eg2.
begin
7 記錄和字段的引用
使用者可以使用系統變數來引用資料檔案中的記錄和字段。
awk每次只是讀取一行文字,因此,在awk程式中記錄和字段的引用都是針對當前記錄來說的。
shell程式設計 文字處理利器awk命令(二)
1 算術運算子 與其他程式語言基本相同,支援浮點數計算,x 5 2,print x直接輸出計算結果 2 賦值運算子 3 條件運算子 expression?value1 value2 eg.grade 2 90?a b print grade 4 邏輯運算子 2 80 3 80 4 80 5 80 輸...
sed Shell 文字處理利器
sed全稱是stream editor,是乙個用於文字過濾和替換的流編輯器,它是乙個管道命令,資料來源來自stdin,它的最小處理單位是行 與awk區分 語法如下 sed nfri 動作 n 使用安靜模式。只有經過sed處理的行才會輸出到螢幕上 f 直接將sed的動作寫在乙個檔案內,f filena...
awk基礎篇 Shell 文字處理利器
sed傾向於以行為單位進行處理,而awk更擅長將一行分為幾段進行處理。awk用法 awk 條件型別1 條件型別2 awk 條件型別1 條件型別2 filenameawk支援兩種資料 既可以通過管道獲取資料,也可以從檔案獲取資料。awk主要是處理每一行的字段內的資料,而預設的字段分割符為空格或tab。...