一,awk介紹
awk:報告生成器,格式化文本輸出
基本用法
a. awk程序通常由 BEGIN語句塊,模式匹配的通用語句塊,END語句塊,這三部分組成
b. 選項
-F:指明輸入時用到的字段分隔符
-v :指定變量
二,awk語言
分隔符,域和記錄
a. awk執行時,有分隔符分隔的字段爲域,標記爲$1,$2...$n
$0爲所有域 和shell中變量$含義不同
b. 文件的每一行爲記錄
c. 不指定域,默認執行print $0
三,awk工作原理
執行順序
a. 執行BEGIN語句塊
b. 逐行掃描文件,執行模式匹配語句塊,從第一行到最後一行
c. 執行END語句塊
這三個語句塊都是可選語句塊
print格式
print item1,item2,..
a. 逗號爲分隔符
b. 輸出的item可以是字符串,數值,當前記錄的字段,變量或者awk的表達式
c. 省略item,相當於print $0
四,awk變量
內置變量
FS:輸入字符分隔斷,默認爲空白字符
OFS:輸出字段分隔符,默認爲空白字符
RS:輸入時的換行符,原換行符仍有效
ORS:輸出時用指定的符號代替原換行符
NF:字段數量
NR:行號
FNR:分別顯示每個文件的行號
FILENAME:當前的文件名
ARGC:命令行參數的個數,本身算第一個參數
ARGV:數組,AGRV[下標數],AGRV[0]是awk
自定義變量
a. -v var=value
b. 可以在模式語句塊中直接定義
五,printf命令
格式化輸出
a. 必須指定格式符
b. 不自動換行,需要給出換行控制符,\n
c. 需要分別給每個item指定格式符
格式符
%d:顯示十進制整數
%f:顯示爲浮點數
%s:顯示字符串
%u:顯示無符號整數
%%:顯示%本身
修飾符
#[.#]:第一個#控制顯示的寬度,第二個#表示小數點後精確度
-:左對齊
+:顯示數值的正負符號
操作符
a. 邏輯操作符
&& , || , !
條件表達式
?if-true:if-false
b. 算數操作符
+,-,*,/,%,^
-x:轉換爲負數
+x:轉換爲數值
c. 賦值操作符
=,+=,-=,*=,/=,%=,^=
++,--
d. 比較操作符
==,!=,>,>=,<,<=
e. 模式匹配符
~:左邊是否和右邊匹配包含
!~:是否不匹配
六,模式匹配
未指定,匹配每一行
/ /,僅處理能模式匹配到的行
關係表達式,結果爲真進行處理
/ /,/ /,行範圍,不支持直接給出數字格式
BEGIN/END模式
BEGIN{}:僅在開始處理文件中的文本之前執行一次
END{}:僅在文本處理完成之後執行一次
看幾個例子,更好的理解有關變量真假的情況
七,awk控制語句
if( ){ }else if( ){ } else if 要打全,跟腳本里的不一樣
while(){}
條件爲真進入循環,爲假退出循環
對一行內的多個字段逐一類似處理時可使用
對數組中的各元素逐一處理時可使用
do{}while()
無論真假,先執行一次循環體
for(){}
for(變量 in 數組){}:遍歷數組中的元素
next
提前結束對本行處理而直接進入下一行處理(awk自身循環)
八,awk數組
可使用任意字符串,字符串要使用雙引號括起來
如果某數組元素事先不存在,引用時,awk會自動創建元素
九,awk函數
數值處理
srand() [種子,沒有rand無法執行] rand():返回0和1之間一個隨機數
int():取整數
字符串處理
length([s]):指定字符串的長度
sub(r,s,[t]):r是被替換的內容,s是替換的內容,t是字符串(可選),只替換匹配到的第一個內容
gsub(r,s,[t]):r是被替換的內容,s是替換的內容,t是字符串(可選),替換所有匹配到的內容
split(s,array,[r]):s是字符串,r是分隔符,用來分隔s,array是數組,元素爲分隔後的字符串
自定義函數
函數名( ){
...
}
十,awk腳本
將awk程序寫成腳本,直接調用或執行
在awk中調用shell命令,需用system
空格分隔,除了awk的變量其他都用""引用起來