awk命令
簡介
awk是一個強大的文本分析工具,功能強大,具備完整的編程特性,若與SQL進行類比,它相當於SQL的select field from table,可以進行數據切片。簡單來說,awk就是把文件逐行讀入,以空格爲默認分隔符將每行切片,然後可以對切開的部分進行各種處理。
相對於grep的查找、匹配和sed的編輯,awk適合對文本進行較複雜的格式處理。
基本語法
awk [options] ‘{pattern + action}’ {filenames}
options 指命令的選項;
pattern 指匹配條件;
action 指對匹配成功的文本進行處理;
filenames 指查找的文件;
awk語言最基本的功能是在文件或者字符串中基於指定規則瀏覽和抽取信息,信息抽取後,才能對其進行操作。完整的awk腳本通常用來格式化文本文件中的信息。
hello.txt文件的內容如下:
1 使用awk最基本的功能,打印內容
不使用options、pattern,直接執行action
awk的工作流程:讀入有’\n’換行符分割的一條記錄,然後按指定的域分隔符劃分域(默認分隔符爲空格或tab鍵),$0表示所有域, $1表示第一個域,$n表示第n個域。
圖中命令的功能是按行讀取hello.txt文件中的內容,並以空格將每一行進行劃分,action爲print $1,即打印分割後的第一個域。
也可以一次性打印多列,可以用逗號","或其他符號分割,示例使用tab鍵分割
⚠️命令中的tab符號\t要用雙引號分隔開;
2 指定分隔符,並添加列名與結束行
把hello.txt文件稍微修改一下:
awk工作流程:
1)執行BEGIN後面的語句{print “column1,column2”}
2)讀取文件,讀入有’\n’換行符分割的一條記錄,然後將記錄按指定的分隔符(:)進行劃分(option爲-F ‘:’,即指定劃分分隔符),action爲{print $1","$2},即打印劃分後的第一個域和第二個域,接着開始讀入第二條記錄…,直到所有的記錄都讀完
選項-F用於指定輸入分隔符
3)執行END操作;
除了使用-F選項來指定分隔符,還能夠通過設置內部變量的方式來指定分隔符,但是在使用FS變量時,需要使用-v選項(-v選項主要用於設置變量的值),用於指定對應的變量。
3 搜索指定關鍵字的記錄
可以指定關鍵字對文件進行搜索
awk內置變量
前面的例子有使用FS內置變量,主要用於指定分隔符;
awk有很多內置變量用來設置環境信息,下面列出一些常用的變量:
ARGC 命令行參數個數
ARGV 命令行參數排列,是一個數組
ENVIRON 支持隊列中系統環境變量的使用
FILENAME awk瀏覽的文件名
FNR 瀏覽文件的記錄數,即各文件分別計數的行號
FS 設置輸入域分隔符,默認爲空白字符
NF 當前記錄的域的個數,即當前行被分割成幾列
NR 已讀記錄個數,行號,即當前處理的文本行的行號
OFS 輸出域分隔符,默認爲空白字符
ORS 輸出記錄分隔符,輸出時用指定的符號代替換行符
RS 輸入記錄分隔符,指定輸入時的換行符
輸出分隔符OFS
當awk爲我們輸出每一列的時候,默認會使用空格隔開每一列,這裏的空格就是awk默認的輸出空格符,這裏的print語句中逗號沒有用雙引號,表明這只是print語句的一部分,而不是輸出的內容。
這裏我們可以用awk的內置變量OFS輸出分隔符來設定awk的輸出分隔符,指定變量的時候需要配合使用-v選項,示例如下:
若要使列合併在一起輸出,沒有輸出間隔符,可以使用以下方式,即print語句中不使用逗號:
內置變量NR與NF
內置變量NR表示每一行的行號,而NF表示每一行一共被劃分爲幾列,示例如下
內置變量FNR
當使用awk同時處理多個文件,並想要分別顯示每個文件的行號,可以使用內置變量FNR,示例如下:
從返回結果可以看出,內置變量FNR會按照順序將文件的行號依次進行排序。
內置變量RS與ORS
RS是輸入行分隔符,若不指定,默認是回車換行符,當然可以通過RS變量來設定分隔符,比如使用:引號,示例如下:
輸出內容時,默認是以回車換行作爲輸出分隔符,也可以使用ORS變量設定輸出分隔符,示例如下:
從結果可以看出,每一條記錄之間使用設定的’+++'來連接,而不是換行。
內置變量FILENAME
變量FILENAME就是顯示文件名,示例如下:
內置變量ARGV與ARGC
ARGV變量表示的是一個數組,這個數組保存的是命令行所給的參數,下標從0開始,示例如下:
由上兩圖可以看出,ARGV是一個數組,第一個參數是awk命令本身,而options、'pattern {action}'不被作爲參數。
ARGC變量是指命令行參數的個數,即ARGV數組的長度,示例如下:
awk自定義變量
awk除內置的變量之外,還可以自定義變量。
有兩種方式來自定義變量:
1)使用 -v varname=value 變量名區分字符大小寫
2)在program中直接定義
示例如下:
第一種方法
當然,也可以在命令行定義變量,只是要引用的時候需要使用$符號:
第二種方法
第二種方法需要注意的是定義的變量之間要使用分號;來分隔開,而打印的時候用逗號。