awk命令初學時沒有主要思路,不清楚具體功能,很容易沉迷在指令參數的海洋里,而且,awk還支持循環、判斷,相當于學習一門小型編程語言,學習難度比較高。
對于大多數人來說,理解能力都差不多,按照本文案例流程,在自己的linux上敲一遍,和結果對比,檢查是否一致,就很容易理解了。
用手學Linux
不求面面俱到,只求初步掌握,熟練后再搭配其他指令靈活運用。
awk簡介
awk是Linux Shell中一種非常強大的文本處理工具,數據可以來自標準輸入或者管道;
awk不僅僅是一個命令,更是一門編程語言,支持選擇結構、循環結構、以及豐富的邏輯運算符,便于進行復雜的文本處理;
awk按照行處理文本,逐行掃描,默認從第一行到最后一行,找到匹配到特定行,并進行相關操作;
awk分別代表其作者姓氏的第一個字母。因為它的作者是三個人,分別是Alfred Aho、Brian Kernighan、Peter Weinberger。
語法格式:
awk 選項 'commands' 文件名常用選項:-F 定義字段分割符號,默認的分隔符是空格-v 定義變量并賦值
-F: 是以:將源文件分隔
/root/匹配源文件中包括root的行,打印出文件名,如果不進行匹配,則源文件有多少行就打印出多少行文件名
$0打印出匹配到行的全部內容
awk內置變量
變量
變量說明
$0
當前處理行的所有記錄
1,1,2,3...3...n
文件中每行以間隔符號分割的不同字段
NF
當前記錄的字段數(列數)
$NF
最后一列
NR
行號
FS
定義間隔符
OFS
定義輸出字段分隔符,默認空格
RS
輸入記錄分割符,默認換行
ORS
輸出記錄分割符,默認換行
FILENAME
當前輸入的文件名
打印列數、最后一列、第1列、第2列、倒數第二列。
打印第1行到第5行。
用分號;分隔開兩部分匹配規則,可以理解為或的關系,前面是匹配1-5行,后面是匹配以root開頭的行,是前3行。一共輸出8行。
格式化輸入printf
%s字符串類型占位符,默認右對齊,前面加負號-左對齊。
awk中BEGIN...END使用
BEGIN:表示在程序開始前執行
END:表示所有文件處理完后執行
用法:'BEGIN{開始處理之前};{處理中};END{處理結束后}'
awk -F: 'BEGIN{print "NAMEtDIRtSHELLn***************************************"}{printf "%-10s %-10s %-10sn",$1,$(NF-1),$NF}END{print "****************************************"}' input.txt
間隔符
BEGIN{FS=":"}相當于使用選項-F:
OFS輸出間隔為兩個制表符t。
輸入內容以@分隔。
輸出內容指定以"++++"分隔。
awk工作原理
- awk使用一行作為輸入,并將這一行賦給內部變量$0,每一行也可稱為一個記錄,以換行符(RS)結束
- 每行被間隔符(默認為空格或制表符)分解成字段,每個字段存儲在已編號的變量中,從$1開始
- 問:awk如何知道用空格來分隔字段的呢?
- 答:因為有一個內部變量FS來確定字段分隔符。初始時,FS賦為空格。
- awk使用print函數打印字段,打印出來的字段會以空格分隔,比如1,1,3之間有一個逗號,但是逗號比較特殊,它映射為另一個內部變量,稱為輸出字段分隔符OFS,OFS默認為空格。
- awk處理完一行后,將從文件中獲取另一行,并將其存儲在$0中,覆蓋原來的內容,然后將新的字符串分隔成字段并進行處理,該過程將持續到所有行處理完畢。
調用awk中變量不需要加$。
邏輯運算符
使用或||運算符打印第1行和第4行。
匹配1-4行或者以hioiei開頭的行。
流程控制
awk的流程控制和一般編程語言中的邏輯一樣,包括選擇結構和循環結構,用于處理復雜的命令邏輯。
if條件判斷單分支結構:{if(表達式){語句1;語句2;...}}
雙分支結構:{if(表達式){語句;語句;...}else{語句;語句;...}}
多分支結構:{ if(表達式1){語句;語句;...}else if(表達式2){語句;語句;...}else if(表達式3){語句;語句;...}else{語句;語句;...}}
循環結構
while循環打印1-10
for循環打印1-10并求和,結果55。
break跳出整個循環,continue跳出本次循環,繼續進入下一次循環,由于本次結束后,i并沒有加1,因此程序一直卡住。
思考,如何調整循環體的順序?使得跳出本次循環后,進入下一次循環。
算術運算
awk按照浮點數進行數學運算。
腳本運行
#!/usr/bin/awk -fBEGIN{FS=":"}NR=1,NR=3{print $1"t"$NF}
運行:
1.awk -f awk.sh input.txt2.awk -f awk.sh input.txt
- 什么是Linux系統?我們是否要用Linux
- 學習Linux命令行,用手就行!
- Linux神之編輯器VIM,史上最強編輯器!
- Linux系統虛擬機和云服務配置,快速搭建學習環境
- Linux系統虛擬機和云服務配置,快速搭建學習環境
- Linux tmux終端復用器,遠程指令再也不會中斷了!
- 遠程登錄Linux服務器,SSH加密傳輸協議,一種更安全的協議
- Linux如何新建用戶,支持多用戶共同使用的操作系統
- 什么是C++編程,經久不衰的老牌編程語言
- 什么是C++變量,就是存儲數據的盒子