一 實踐中學習 awk

2021-08-29 01:13:06 字數 4236 閱讀 5314

內建變數

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,...