awk

 

正則表達三劍客:

grep:文

本過濾器

sed:行編輯器

awk: 報告生成器

GNU AWK :gawk

awk使用的基本語法

awk [options]’program’file file...

awk[options]’’

awk工作原理   切片整行  輸入空白符號   默認空格  賦值給內建變量$1 $2...整行$0

$nf  number file

遍歷。。。爲什麼還要循環呢   每一行都有很多字段    如果對每一行的字段   按條件  就需要循環了

awk的輸出

print item1,item2

①各項目之間使用逗號分隔,而輸出時則使用輸出分隔符分隔

②輸出的各item可以是字符串或者數值。當前記錄的字段 變量或者awk表達式。數值會被隱式轉換爲字符串後輸出

③print後面的item如果省略,相當於print  $0 ,輸出空白,使用print””

#awk -F: '{print $1}' /etc/passwd

#awk -F: '{print "hello",$1}' /etc/passwd

2.awk的變量

內置變量

自定義變量

2.1內置變量

FS:Field Seperator ,輸入時的字段分隔符

#awk 'BEGIN{FS=":"}{print $1,$7}' /etc/passwd

RS:Record Seperator ,輸出行分隔符

OFS :Output filed Seperator 輸出時的字段分隔符

#awk 'BEGIN{FS=":";OFS=":"}{print $1,$7}' /etc/passwd

ORS:Output Row Seperator 輸出時的行分隔符

#awk 'BEGIN{FS=":";ORS=":"}{print $1,$7}' /etc/passwd

NF:numbers of field 字段數

NR:numbers of Record 行數  所有文件的一併計數

FNR:行數 各文件分別計數

#awk 'BEGIN{FS=":";OFS=":"}{print FNR,$1,$7}' /etc/passwd

Awk中引用變量引用無需加$符號

ARGV 數組  保存命令本身這個字符,awk'{print $0}'1.txt 2.txt 意味着ARGV[0]保存awk

ARGC 保存awk命令中參數的個數的

awk‘BEGIN{print ARGV[0],ARGV[1]}' /etc/passwd /etc/group

awk 'BEGIN{print ARGV[0],ARGV[1],ARGC}' /etc/passwd /etc/group

FILENAME:awk正在處理的當前文件的名稱

2.2可自定義變量

-v var_name=VALUE

變量名區分字符大小寫;

#awk 'BEGIN{a="hello awk"}{print a]' /etc/passwd

#awk 'BEGIN{a="hello awk";print a}'

#awk -v a="hello gawk" 'BEGIN{print a}

'

①可以在program中定義變量

②可以在命令行中定義變量:awk中-v的選項

3.awk的printf(打印格式)

命令使用格式:printf format,item1,item2...

要點:

(1)要指定format

(2)不會自動換行,如需換行則需要給出\n

(3)Format用於爲後面的每個item指定其輸出格式

Format格式的指示符都%開頭,後跟一個字符

%c顯示字符的ASCII碼

%d ,%i 十進制整數

%e,%E 科學計數法顯示數值

%f 顯示浮點數

%g,%G以科學計數法格式或者浮點數格式顯示

%s 顯示字符串

%u  顯示無符號整數

%% 顯示%自身

修飾符:

# 顯示寬度

- 左對齊

+ 顯示數值的符號

.# 取值精度

#awk -F:'{printf "%20s,%30s\n",$1,$7}' /etc/passwd

#awk -F:'{printf "%15s,%-20s\n",$1,$7}' /etc/passwd

浮點數格式

#awk 'BEGIN{printf "%f\n",3.1415}'

浮點數格式#awk 'BEGIN{printf "%f\n",3.1415926}'

 

wpsACF.tmp

wpsAD0.tmp

wpsAD1.tmp

wpsAE1.tmp

wpsAE2.tmp

wpsAE3.tmp

4 awk輸出重定向

Print items > output-file

Print items  >> output-file

Print items | command

特殊文件描述符

/dev/stdin:標準輸入

/dev/stdout:標準輸出

/dev/stderr:錯誤輸出

5.awk的操作符

算術操作符:

x+y

x-y

x*y

x/y

x**y,x^y

x%y

-x 負值

+x 轉換爲數值

賦值操作符

=

+=

-=

*=

/=

%=

^=

**=

++

--

如果模式自身爲=號  要寫爲/=/

比較操作符

<

<=

>

>=

==

!=

~ 模式匹配 左邊的字符串能夠被右邊的模式所匹配  匹配爲真 否則爲假

!~

subscript in array

邏輯操作符

&&與

|| 或

條件表達式

selector?If-true-expression:if-false-expression   表達式

wpsAF4.tmp

函數調用:

function_name(argu1,argu2)

6.模式

①正則表達式Regexp:格式爲/PATTERN/

僅處理被/PATTERN匹配到的行

wpsAF5.tmp

wpsAF6.tmp

②Expression :表達式,其結果爲非0或者非空字符串時滿足條件

僅處理滿足條件的行

wpsAF7.tmp

wpsB08.tmp

③Ranges:行範圍,此前地址定界,startline,endline

僅處理範圍內的行

④BEGIN/END;特殊模式,僅在awk命令的program運行之前(BEGIN)或運行之後(END)執行一次

⑤Empty:空模式,匹配任意行

7.awk 常用的action

①Expression表達式

②Control statements   控制語句

③Compound statements 組合語句

④Input statements 輸入語句

⑤Output statements 輸出語句

8控制語句

①if-else語句

格式:if(condition){then body}else{else body}

如果id號大於500 爲普通用戶  否則爲系統用戶

wpsB09.tmp

#awk -F: &#8217;{if ($3>=500) {print $1}}&#8217;

wpsB0A.tmp字段數大於8的數

wpsB0B.tmp

②while

格式:while (condition){while body}

例:顯示inittab第奇數字段

wpsB1B.tmp

wpsB1C.tmp

length()函數  取字符串的長度  內置函數

字符個數大於等於6的

wpsB1D.tmp

③do-while 循環

格式:do{do-while body}while(condition) 至少循環一次循環體

顯示奇數的字段

④for循環

格式:for (variable assignment;condition;iteration process){for body}

wpsB1E.tmp

字段大於等於6的

wpsB2F.tmp

for循環可用來遍歷數組元素

語法:for (i in array){for body}遍歷元素的縮影

⑤case語句

wpsB30.tmp

語法:switch(Expression){case VALUE or RGEEXP/: statement1;...default: stementN}

⑥循環控制

break

continue

⑦next

提前結束對本行的處理而進入下一行進行處理

顯示passwd下奇數行的用戶名

wpsB31.tmp

如果某一行id爲偶的顯示 

wpsB32.tmp

9.數組

array[index-expression]

Index-expression:可以使用任意字符串  如果某數組元素事先不存在,那麼在引用時,awk會自動創建此元素並將其初始化爲空字串。因此,要判斷某數組是否存在某元素,必須使用&#8220;index in array&#8221;這種格式。

例A[FIRST]=&#8217;hello awk&#8217;&#8217;

print A[second]

要遍歷數組中的每一個元素,需要使用如下特殊結構

For (var in array) {for body}

其var會遍歷array的索引

state[LISTEN]++

state[ESRABLISHED]++

wpsB44.tmp

wpsB59.tmp

刪除數組元素

delete array [index]

10.awk的內置函數

wpsB6A.tmp

split(string,array[,fieldsep[,seps]]):

功能 :將sring表示的字符串以fieldsep爲分隔符進行切片,並切片後的結果保存至

wpsB6B.tmp

wpsB6C.tmp

wpsB7C.tmp

顯示每個ip地址的次數

 

wpsB8E.tmp

wpsB8F.tmp

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章