awk介紹
awk是一種可以處理數據、產生格式化報表的語言,功能十分強大,awk認爲文件中每一行是一條記錄,記錄與記錄的分隔符爲換行符,每一列是一個字段,字段與字段的分隔符默認是一個或多個空格或tab製表符。
awk的工作方式是讀取數據,將每一行視爲一條記錄,每條記錄以字段分隔符分成若干字段,然後輸出各個字段的值
awk語法:awk [options][BEGIN]{program}[END][file]
常用命令選項:
-F fs 指定描繪一行中數據字段的文件分隔符,默認爲空格
-f file 指定書讀程序的文件名
-v var=value 定義awk程序中使用的變量和默認值
注意:awk程序腳本由左大括號和右大括號定義,腳本命令必須放置在兩個大括號之間。
awk程序運行優先級是:
1) BEGIN:在開始處理數據流之前執行,可選項
2) program:如何處理數據,必選項
3) END:處理完數據流後執行,可選項
awk基本用法-awk數據提取功能
學習用例,數據源test.txt
1> awk對字段(列)的提取
字段提取:提取一個文本中的一列數據並打印輸出
字段相關內置變量
$0 表示整行文本
$1 表示文本中的第一個數據字段
$2 表示文本中的第二個數據字段
$N 表示文本中的第N個數據字段
$NF 表示文本中的最後一個數據字段
1) awk '{print $0}' test.txt 讀入text.txt每行數據並把每行數據打印出來
2) awk '{print $NF}' test.txt 讀入text.txt每行數據並打印最後一列
3) awk '{print $3}' test.txt 讀入text.txt每行數據並打印第三列
2> awk對記錄(行)的提取
記錄提取:提取一個文本中的一行並且打印輸出
記錄的提取方式有兩種:a、通過行號b、通過正則匹配
記錄相關內置變量
NR:指定行號
1) awk 'NR==3{print $0}' test.txt 獲取test.txt第三行數據
2) awk -F ":" 'NR==1{print $1,$3,$5}' /etc/passwd 獲取/etc/passwd第一行中第1、3、5列的數據,/etc/passwd中的字段以:作爲分隔符,所以需要指定分隔符:
3> awk程序的優先級
關於awk程序的執行優先級,BEGIN是優先級最高的代碼塊,是在執行PROGRAM之前執行的,不需要提供數據源,因爲不涉及到任何數據的處理,也不依賴與PROGRAM代碼塊;OROGRAM是對數據流做操作,是必選的代碼塊,也是默認的代碼塊,所以在執行的時候必須提供數據源;END是處理完數據流之後的操作,如果需要執行END代碼塊,就必須需要PROGRAM的支持,單個無法執行
1) awk 'BEGIN{print "hello lavender"}{print $0}END{print "bye lavender"}' test.txt
2) awk 'BEGIN{print "hello lavender"}' 不需要數據源 可以直接執行
3) awk '{print "hello lavender"}' awk 'END{print "hello lavender"}' 沒有提供數據流,所以無法執行
4) awk '{print "hello lavender"}' test.txt
awk高級用法
1> awk定義數組
數組定義方式:數組名[索引]=值
awk 'BEGIN{array[0]=100;array[1]=200;print array[0],array[1]}'
awk中可以定義變量 head -2 /proc/meminfo |awk 'NR==1{t=$2}NR==2{f=$2;print (t-f)*100/t "%"}' 計算內存使用率
2> awk運算
1. 賦值運算 =
2. 比較運算 > >= == < <= !=
3. 數學運算 + - * / % ** ++ --
4. 邏輯運算 && ||
5. 匹配運算 ~ !~
1) 賦值運算,見上面的變量和數組定義
2) 比較運算 如果比較的字符串則按ascii編碼順序比較,如果結果返回爲真則用1表示,如果返回爲假則用0表示
3) 數學運算
4) 邏輯運算
5) 匹配運算
3> awk環境變量
FIELDWIDTHS 以空格分隔的數字列表,用空格定義每個數據字段的精確寬度
FS 輸入字段分隔符號
OFS 輸出字段分隔符號
RS 輸入記錄分隔符
ORS 輸出記錄分隔符號
awk 'BEGIN{FS=":";OFS="-"}$1=="root"{print $1,$3,$5}' /etc/passwd
4> 流程控制
1. if判斷語句
2. for循環語句
3. while循環語句
4. do...while語句
5. 循環控制
學習用例;num.txt
1) 打印$1大於5的行
2) 累加
awk小技巧
1> 打印test.txt文本中的行數 awk 'END{print NR}' test.txt
2> 打印test.txt文本最後一行的內容 awk 'END{print $0}' test.txt
3> 打印test.txt文本中的總列數 awk 'END{print NF}' test.txt