awk基礎
1.1 PRintprint的使用格式:
print item1,item2, ….
要點:
各項目自己使用逗號隔開,而輸出時則以空白字符分隔;
輸出的item可以為字符串或者數值,當前記錄的字段(如$1)、變量或者awk的表達式;數值會先轉換為字符串,而后再輸出;
print的命令后面的item可以省略,此時其功能相當于print $0,因此,如果想輸出空白行,則需要使用print “”;
例子:
# awk ‘BEGIN {print “line one/nline two/nline three”}’
awk –F: ‘{print $1,$2}’ /etc/passwd
內置變量:
ORS(output record sepatator) (輸出換行符)
OFS(output field separator) (輸出分隔符)
FS: field separator,默認是空白字符;(輸入文件分隔符)
RS:Record separator,默認是換行字符;(輸入文件換行符)
NR:The number of input records,awk命令所處理記錄數:如果有多個文件,這個數目會把處理的多個文件中行統一計數;
NF:Number of Field,當前記錄的field個數;
FNR:與NR不同的是,FNR用于記錄正處理的行是當前這一文件中被總共處理的行數;
ARGV:數組,保存命令行本身這個字符串,如awk’{print $0}’ a.txt b.txt這個命令中,ARGV[0]保存awk,ARGV[1]保存a.txt;
ARGC:awk命令的參數的個數;
1.2 printfprint命令的使用格式:
printf format,item1,item2,….
要點:
與其print命令的最大不同是,printf需要指定format;
format用于指定后面的每個item的輸出格式;
printf語句不會自動打印換行符;
format格式的指示符都以%開頭,后跟一個字符;如下:
%c:顯示字符的ASCII碼:
%d,%i:十進制整數:
%e,%E:科學計數法顯示數值;
%f:顯示浮點數;
%g,%G:以科學計數法的格式或浮點數的格式顯示數值;
%s:顯示字符串
%u:無符號整數
%%:顯示%自身
修飾符:
N:顯示寬度;
-:做對齊
+:顯示數值符號
例子:
#awk–F: ‘{printf “%-15s %/n”,$1,$3 }’ /ect/passwd
1.3輸出重定向printitems > output-file
printitems >> output-file
特殊文件描述符:
/dev/stdin:標準輸入
/dev/stdout:標準輸出
/dev/stderr:錯誤輸出
/dev/df/N:某特定文件描述符,如/dev/stdin就相當于/dev/fd/0;
例子
awk–F: ‘{printf “%-15s %i/n”,$1,$3 > “/dev/stderr”}’/etc/passwd
1.4 awkawk的使用格式:
awk[options] ‘script’ file1,file2,….
awk[options] ‘PATTERN {action}’ file1,file2, ….
-F:
1、算術操作符:
-x:負值
+x:轉換為數值
x^y:
x**y:次方
x*y:
x+y:
x-y:
x%y:
2、字符串操作符:
只有一個,而且不用寫出來,用于實現字符串連接:
3、賦值操作符:
=、+=、-=、*=、/=、%=、^=、**=
++、--
需要注意的是,如果某模式為=號,此時使用/=/可能會有語法錯誤,應該為/[=]/代替
4、布爾值
awk中,任何非0值或非空字符串都為真,反之就為假;
5、比較操作符:
x< y 、x<=y、 x> y、 x>= y、 x== y、x!= y、x~ y、x!~ y
6、表達式間的邏輯關系:
&&、||
7、條件表達式
selector?if-true-exp:if-false-exp
$A> $B ? echo $A:echo $B
8、行數調用
function_name(para1,para2)
9、awk的模式:
awk‘program’ input-file1 input-file2 ….
其中的program為:
pattern{ action }
pattern{ action }
….
常見的模式類型:
Regexp:正則表達式,格式為/regularexpression/
expression:表達式,其中值非0或為空字符時滿足條件,如:$1~/foo/ 或 $1==”magedu”,用運算符~(匹配)和~!(不匹配)
Ranges:指定的匹配范圍,格式為pat1,pat2
BEGIN/END:特殊模式,僅在awk命令執行前運行一次或結束前運行一次
Empty(空模式):匹配任意輸入行;
常見的Action有:
Expressions
Controlstatements
Compoundstatements
Inputstatements
Outputstatements
/正則表達式/:使用通配符的擴展集
關系表達式:可以用下面運算符表中的關系符進行操作,可以是字符串或者數值的比較多,如$2> $1 選擇第二個字段比第一個字段長的行。
awk–F: ‘$3 >= 500 {print $1}’ /ect/passwd
awk–F: ‘$3 >= 500 {print $1,$3}’ /ect/passwd
awk–F: ‘$3 >= 500 {printf “%-15s%s/n”,$1,$3}’ /ect/passwd
awk–F: ‘$3 >= 500 {print “Username UID”;printf“%-15s%s”,$1,$3}’ /ect/passwd
模式匹配表達式:
模式,模式:指定一個行的范圍,該語法不能包括BEGIN和END模式
BEGIN:讓用戶指定在第一條輸入記錄被處理之前說發生的動作,通??稍谶@里設置全局變量。
END:讓用戶在最后一條輸入記錄被讀取之后發生的動作
awk–F: ‘BEGIN {print “Username UID”}{printf “%-15s%s”,$1,$3}’/ect/passwd
awk–F: ‘BEGIN {print “Username UID”}{printf“%-15s%s”,$1,$3}END{print “Over}’ /ect/passwd
awk‘BEGIN {print “a” “b”}’
awk–v FS=: ‘{print $1}’ /etc/passwd
awk‘BEGIN{FS=”:”}{print $1}’ /ect/passwd
例子:
vima.txt
welcometo redhat linux.
howare you?
awk‘{print $1}’ a.txt
df–h
df–h |awk ‘{print $1}’
df–hP |awk ‘{print $1}’
awk‘{print $1}’ /etc/passwd
awk–F: ‘{print $1}’ /etc/passwd
awk–F: ‘{print $1,$7}’ /etc/passwd
awk–F: ‘{print $NF}’ /etc/passwd
awk‘{print $NF}’ a.txt
awk–v FS=: ‘{print $NF}’ /etc/passwd
awk‘{print $1 $2}’ a.txt
awk‘{print $1,$2}’ a.txt
awk-v OFS=: ’{print $1,$2}’ a.txt
awk‘{printf “%-10s,%s/n”,$1,$2}’ a.txt
awk‘{printf “%-10s%s/n”,$1,$2}’ a.txt
awk‘BEGIN{print “a” “b”}’
awk–F: ‘$1 ~ /^root/{print $3,$4,$NF}’ /ect/passwd
awk–F: ‘$1 !~ /^root/{print $3,$4,$NF}’ /ect/passwd
awk–F: ‘/bash/{print $0}’ /etc/passwd
awk–F: ‘/bash/{print $1}’ /etc/passwd
控制語句
if-else
語法:if(condition)(then-body) else{[ else-body]}
例子:
awk–F: ‘{if ($1==”root”) print $1, “admin”;else print$1,”Common User”}’ /ect/passwd
awk–F: ‘{if($1==”root”) printf “%-15s:%s/n”,$1,”Admin”;elseprintf “%-15s:%s/n”,$1, “Common User”}’ /ect/passwd
awk–F: -v sum=0 ‘{if ($3 >= 500) sum ++}END {print sum}’/ect/passwd
while
語法:while(condition) {statements1;statements2;……}
awk–F: ‘{i=1;while (I <= 3) {print $1;i++}}’ /ect/passwd
awk–F: ‘ $1!~/root/ {i=1;while (i <= 4) {print $1;i++}}’/ect/passwd
awk–F: ‘ $1!~/root/ {i=1;while (i <= NF) {print $1;i+=2}}’/ect/passwd
awk–F: ‘ $1!~/root/ {i=2;while (i <= NF) {print $1;i+=2}}’/ect/passwd
do-while
語法: do{statements1;statements2;……} while (condition)
awk–F: ‘{i=1; do {print $i;i++} while (i <=3) }’ /etc/passwd
for
語法:for(variable assignment;condition; iteration process ) {statements1;statements2;…}
awk–F: ‘{for (i=1;i<=3;i++) print $1}’ /ect/passwd
awk–F: ‘{for (i=1;i<=NF;i+=2) print $i}’ /ect/passwd
for循環還可以用來遍歷數組元素:
語法:for(i in array ) {statements1;statements2;……}
awk–F: ‘$NF!~/^$/{BASH[$NF]++}END{for (A in BASH) {printf“%15s:%i/n”,A,BASH[A]}}’ /ect/passwd
case
語法:seitch(expression) {case VALUE or /ERGEXP/:statements1;statements2;…default statements0 }
break和continue
常用于循環或case語句中
next
提前結束對本行文本的處理,并接著處理下一行
awk內置變量:
FS:field separator,默認是空白字符;
RS:Recordseparator,默認是換行字符;
NR:Thenumber of input records,awk命令所處理記錄數:如果有多個文件,這個數目會把處理的多個文件中行統一計數;
NF:Numberof Field,當前記錄的field個數;
FNR:與NR不同的是,FNR用于記錄正處理的行是當前這一文件中被總共處理的行數;
ARGV:數組,保存命令行本身這個字符串,如awk’{print$0}’ a.txt b.txt這個命令中,ARGV[0]保存awk,ARGV[1]保存a.txt;
ARGC:awk命令的參數的個數;
forI in {0 .. 10}
printA[$i]
for(A in ARRAY) {print ARRAY[A]}
awk‘BEGIN {A[“m”]=”hello”;A[“n”]=”world”;for (B in A)print A[B]}’
awk中使用數組
array[index-expression]
index-expression可以使用任意字符串,需要注意的是,如果某數據組元素事項不存在,那么在應用其時,awk會自動創建此元素并初始化為空串;因此,要判斷某數據組中是否存在某元素,需要使用indexin array的方式。
要遍歷數組中的每一個元素,需要使用如下的特殊結構:
for(var in array) {statement1,…}
其中,var用于引用數組下標。
例子:
netstat–n|awk ‘/^tcp/ {++S[$NF]} END {for (a in S) print a,S[a]}’
netstat–ant |grep “LISTEN” |wc –l
netstat–ant | awk ‘$1 ~/tcp/{S[$NF]++}END{for (A in S) print A,S[A]}’
netstat–ant | awk ‘$1 ~/tcp/{S[$NF]++}END{for (A in S) printf“%10s:%s/n”, A,S[A]}’
awk–F: ‘$NF!~/^$/ {SHELL[$NF]++}END{for (A in SHELL) printA,SHELL[A]}’ /etc/passwd
awk‘{IP [$1]++}END{for (A in IP) print A,IP[A]}’/usr/local/apach/logs/access_log
每出現一被/^tcp/模式匹配到的行,數組S[$NF]就加一,NF為當前匹配的行的最后一個字段,此處用其值作為數組S的元素索引;
awk‘{count[$1]++};END {for (url in counts) print counts[url],url}’/var/log/httpd/access_log
用法與上一個例子相同,用于統計日志文件中IP地址的訪問量
awk‘BEGIN{A[x]=”hello”;A[y]=”world”;print A[x],A[y]}’
awk的內置函數
split(string, array [,fieldsep [,seps]])
功能:將string表示的字符串以filedsep為分隔符進行分割,并將分隔后的結果保存至array為名的數組中
netstat–ant | awk ‘/:80/ {split($5,clients,”:”);IP[client[1]]++}END{for (i in IP) {print IP[i],i}}’|sort –rn |head -50
將netstat查詢結果的第五列開始以:為分隔符開始切割,切割的結果保存在client數組中,并累計。
length([string])
功能:返回string字符串中字符的個數
substr(string ,start[, length])
功能:取string字符串中的子串,從start開始,取length個,start從1開始計數;
system(command)
功能:執行系統command并將結果訪問至awk命令
systime()
功能:取系統當前時間
awk[options] ‘PATTERN{cation}’ input_file
新聞熱點
疑難解答