GNU awk:
簡介:awk是一個數據處理工具。它比較傾向于將一行分成多個“字段”來處理。所以,awk比較適合處理小型數據。
gawk – pattern scanning and processing language
實現原理:
基本用法:gawk [options] 'program' FILE
program:PATTERN{ACTION STATEMENTS}語句之間用分號分割
print,printf
選項:
-F:指明輸入時用到的字段分隔符;
-v var=value:自定義變量;
如:
基本常用輸出命令
-
print
-
格式:print item1,item2,…
-
逗號為分隔符
-
輸出的各item可以為字符串,也可以為數值,當前記錄的字段、變量或awk的表達式;
-
如省略item;則打印$0。
-
變量
-
內建變量
FS:input field seperator,默認空白字符。
OFS:output field seperator,默認空白字符。
RS:input record seperator,輸入時的換行符。
ORS:output record seperator,輸出時的換行符。
NF:number of field,字段數量。
NR:number of record,行數量。
FNR:分別計算各文件行數。
FILENAME:文件名。
ARGC:命令行參數的個數;
ARGV:數組,保存的是命令行所給定的各參數:
-
自定義變量
(1)-v var=value(變量名區分字符大小寫)
(2)在program中直接定義
-
printf命令
-
格式化輸出:printf FORMAT,item1,item2,…
-
FORMAT必須給出;
-
不會自動換行,需要給出換行控制符,\n
-
FORMAT中需要分別為后面的每個item指定一個格式化符號;
格式符:
%c:顯示字符的ASCII碼;
%d,%i:顯示十進制證書;
%e,%E:科學計數法數值顯示;
%f:顯示為浮點數;
%g,%G:以科學計數法或浮點形式顯示數值;
%s:顯示字符串:
%u:無符號整數:
%%:顯示%自身。
修飾符:
#[.#]:第一個數字控制顯示的寬度;第二個數字控制小數的精度。
-:左對齊
+:顯示數值的符號
-
操作符
算術操作符:
x+y, x-y, x*y, x/y, x^y, x%y
-x: 轉換為負數
+x: 轉換為數值
字符串操作符:沒有符號的操作符,字符串連接
賦值操作符:
=, +=, -=, *=, /=, %=, ^= ++, —
比較操作符:
>, >=, <, <=, !=, ==
模式匹配符:
~:左邊是否和右邊匹配包含
!~:是否不匹配
邏輯操作符:&&,||,!
如顯示系統賬號與root賬號
awk –F: '$3>=0 && $3<=1000 {print $1}' /etc/passwd
函數調用: function_name(argu1, argu2, …)
條件表達式: selector?if-true-expression:if-false-expression
-
PATTERN:根據pattern條件,過濾匹配的行,再做處理
-
(1)如果未指定:空模式,匹配每一行
-
(2) /regular expression/:僅處理能夠模式匹配到的行,需要用/ /括起來
awk '/^UUID/{print $1}' /etc/fstab
awk '!/^UUID/{print $1}' /etc/fstab
-
(3) relational expression: 關系表達式;結果有“真”有“假”;結果為“ 真”才會被處理;
真:結果為非0值,非空字符串
假:結果為空字符串
-
(4) line ranges:行范圍 startline,endline:/pat1/,/pat2/ 不支持直接給出數字格式
awk -F: '/^root/,/^nobody/{print $1}' /etc/passwd
awk -F: '(NR>=2&&NR<=10){print $1}' /etc/passwd
-
(5) BEGIN/END模式
BEGIN{}: 僅在開始處理文件中的文本之前執行一次
END{}:僅在文本處理完成之后執行一次
如:開始結束
-
awk控制語句if-else
-
語法: if(condition) statement [else statement] if(condition1){statement1}else if(condition2) {statement 2}else{statement3}
-
使用場景:對awk取得的整行或某個字段做條件判斷
awk -F: '{if($NF=="/bin/bash") print $1}' /etc/passwd
示例:
-
while循環
-
語法:while(condition) statement
-
條件“真”,進入循環;條件“假”,退出循環
-
使用場景: 對一行內的多個字段逐一類似處理時使用 對數組中的各元素逐一處理時使用
-
do-while循環
-
語法:do statement while(condition)
-
意義:無論真假,至少執行一次循環體
-
示例:做1+2+3+…+100
awk 'BEGIN{ total=0;i=0;do{ total+=i;i++;}while(i<=100);print total}'
-
for循環
-
語法:for(expr1;expr2;expr3) statement for(variable assignment;condition;iteration process) {forbody}
-
特殊用法:能夠遍歷數組中的元素; 語法:for(var in array) {for-body}
-
示例:awk '/^[[:space:]]*linux16/{for(i=1;i<=NF;i++) {print $i,length($i)}}' /etc/grub2.cfg
-
switch語句
-
語法:switch(expression) {case VALUE1 or /REGEXP/: statement; case VALUE2 or /REGEXP2/: statement; …; default: statement}
-
break和continue
-
awk ‘BEGIN{sum=0;for(i=1;i<=100;i++) {if(i%2==0){continue}sum+=i}print sum}‘
-
awk ‘BEGIN{sum=0;for(i=1;i<=100;i++) {if(i==11){break}sum+=i}print sum}‘
-
break [n] n代表跳出第幾輪循環
-
continue [n]
-
next 提前結束對本行處理而直接進入下一行處理(awk自身循環) awk -F: '{if($3%2!=0) next; print $1,$3}' /etc/passwd
-
關聯數組:array[index-expression]
-
index-expression:
-
(1) 可使用任意字符串;字符串要使用雙引號括起來
-
(2) 如果某數組元素事先不存在,在引用時,awk會自動創建 此元素,并將其值初始化為“空串”
-
(3)若要判斷數組中是否存在某元素,要使用“index in array”格 式進行遍歷
-
若要遍歷數組中的每個元素,要使用for循環
-
for(var in array) {for-body}
-
注意:var會遍歷array的每個索引
-
示例
原創文章,作者:502795641,如若轉載,請注明出處:http://www.www58058.com/48351
寫的很好,每一個awk用法都有一個詳細的示例,如果能有一部分的示例結果,可能會直觀點哦。