內建變數
awk 中預先定義好的,內建在 awk 內部的變數。
變數名描述
fs輸入字段分隔符,預設是空格
ofs輸出字段分隔符,預設是空格
rs輸入記錄分隔符,預設換行符
ors輸出記錄分隔符,預設換行符
nfnumber of fields,當前記錄中域的個數,也就是每行有多少列
nrnumber of rows,已經讀出的記錄數,也就是行號。從1開始,有多個檔案時,這個值會累加
fnr各個檔案分別計數的行號,和 nr 類似,這個是相對於當前檔案的,當處理多個檔案時很有作用,每當從新的檔案讀入時,fnr 都會被重置為 0
filename
當前檔名
agrc
命令列引數的個數
argv
陣列,儲存命令列所傳的各個引數
記錄awk 把每乙個換行符結束的行稱為乙個記錄,$0 變數:它指的是整條記錄。
# 輸出 test.txt 檔案中的所有記錄
awk'' test.txt
變數 nr:乙個計數器,每處理完一條記錄,nr 的值就增加 1。
# 輸出 test.txt 中的所有記錄,並在記錄前顯示行號
awk'' test.txt
域
記錄中的每個單詞都稱作「域」,預設情況下以空格分隔。awk 可跟蹤域的個數,並在內建變數 nf 中儲存該值。
# 列印第一和第三個以空格分開的列(域)
awk'' test.txt
awk 命令格式
有了上邊域和記錄的概念,來看看 awk 的命令格式:
awk [options] 'pattern' file
eg1:
# $3 == 0:是 pattern
# print $0:是 action
awk'$3==0 ' employee # 如果第三個域等於 0,則將這行列印
eg2:
下面這個 awk 指令碼沒有指定 action,但結果和 eg1 一樣,沒有指定 action 時預設是(列印整行)。
awk
'$3 == 0' employee
eg3:
#將結果重定向到檔案
awk'$3 == 0' employee > other.txt
域分隔符
輸入分隔符(field separator),就是 test.txt 中每個列是以什麼進行分隔的,awk 預設以空格對每一行進行分隔,分隔符得值儲存在內建變數 fs中,可以通過-f命令列選項修改fs的值。
# 指定 : 作為分隔符
awk -f: '' test.txt
# 顯示指定空格作為分隔符
awk -f'[ ]'
'' test.txt
# 指定空格、冒號、tab 作為分隔符
awk -f'[:\t ]'
'' test.txt
# 指定以逗號(,)作為分隔符
awk -f, '' separator.txt
# 使用 -v 選項對內建變數設定分隔符,和 awk -f, 效果一樣
awk -v fs=
',''' separator.txt
輸出分隔符(out field separator), 大白話表示就是 awk 在處理完文字後以什麼字元作為分隔符將每行輸出,預設也是空格,儲存在內建變數 ofs 中。
eg1:
# 對內建變數 ofs 賦值
awk -v ofs=
"->"
'' other.txt
輸出如:
beth->4.00->0
dan->3.75->0
eg2:
# 同時指定輸入和輸出分隔符
awk -v fs=
',' -v ofs=
'->'
'' separator.txt
模式-pattern
根據前面的一些例子,awk 的語法如下:
awk [options] 'pattern ' file1 file2
options(選項): 如前面使用過的 -v -f
action(動作):如 print
pattern:也就是條件,乙個關係表示式,awk 會逐行處理文字,處理完當前行,然後再處理下一行。如果不指定任何的「條件」,awk 會一行一行的處理完檔案的每一行,如果指定了「條件」,只處理滿足條件的行。這即 awk 中的模式。
# 將有四列的行列印出來
awk'nf == 4 ' column.txt
# 沒有指定模式則是空模式,空模式會匹配文字中每一行,每一行都滿足條件
awk'' test.txt
正則模式
# 將包含 in 的記錄行進行列印
awk'/in/ ' pattern.txt
行範圍模式
eg1:
# 從第一行 到 正則匹配到的第一行 之間的所有行進行列印
awk'nr == 1, /in/' pattern.txt
# /xx/ 沒有匹配到第二個模式,列印第乙個模式出現的行到文字末尾
awk'nr == 1, /xx/' pattern.txt
看一下結果:
# 將第一行 到 正則匹配到的第一行中的 in 替換為 on(從記錄行的左邊開始,只替換一次)
# 怎麼理解這個 1 呢?
# 這裡有兩個模式,awk 讀出每行記錄都會經過這兩個模式的判斷
# 1 表示這個模式為真,沒有指定模式預設的 action 就是列印整行
再來一波例子估計就懂 eg2 中的用法了:
在 1 處,模式指定為 1 表示為真,走預設的 action 列印整行。
在 2 處,指定了兩個模式,每行記錄都會經過這兩個模式的處理,然後分別執行模式自己的動作。
在 3 處,有 3 個模式:begin 模式和 end 模式,中間的是空模式(沒有指定模式)。begin 模式:處理文字之前先執行的操作;end 模式:處理完所有行後需要執行的操作。
範圍模式的第乙個模式和第二個模式都以第一次匹配到的行為準。
awk 內建函式
字串函式
sub
sub (regular expression, substitution string):
sub (regular expression, substitution string, target string)
對每乙個記錄行從左到右第乙個匹配到的域進行替換,每一行只會匹配替換一次。
# 將每行第一次出現的域 hello 替換為 hi,每行只會匹配替換一次
awk'' test.txt
# 對每行的第乙個域進行替換
awk'' test.txt
gsub
全域性替換,會對每一行中每個符合正規表示式條件的域都會進行替換。
# 將每一行中出現的 m 替換為 m
awk'' poem.txt
更多awk實踐例子可參考:
【二】實踐中學習 awk
很好的 awk 入門教程:
awk程式語言
awk 從放棄到入門
awk 簡明教程
在實踐中學習
轉眼時間過得飛快,大學四年就像夢一樣過去了,當初惴惴不安地擔心自己能不能過畢業設計,稀里糊塗畢業證都已經拿到了手上。經過了被乙個非常有前途的單位放了鴿子,當初全力去拼搶的東西到頭來全是泡影,還好大學裡也不是全部都稀里糊塗,也學了點皮毛,找了對口的程式設計工作。可是,技術畢竟不高,在這裡,壓力很大。有...
實踐中學習vim之按鍵序列對映
術語說明 本文對於vim中所有能引起動作的字串行統稱為 命令 這不僅僅包含以 開頭的命令列模式下的命令,也包括其他模式下的按鍵序列。注意 由於vim各個部分相互關聯緊密,簡單起見,本文中描述時不會完全考慮與之相聯絡的其他主題,由此會造成不準確的描述。vim採用了 不同模式 設計思想,它擁有很多模式,...
第一天課程 從實踐中學習
program laotzu.cpp include some programs to surpress unneeded warnings pragma warning disable 4068 pragma argsused int winapi winmain hinstance hinst,...