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