awk使用

awk的驚人表現

awk能夠勝任幾乎全部的文本處理工做。

 

 

awk

調用

1.調用awk:

方式一:命令行方式

awk [-F field-separator ] ‘commands’ input-file(s)

[ -F域分隔符 ]是可選的,由於awk使用空格做爲缺省的域分隔符,所以若是要瀏覽域間有空格的文本,沒必要指定這個選項,若是要瀏覽例如passwd文件.此文件名域以冒號做爲分隔符,則必須指明-F選項,如:

awk -F ‘commands’ input-file

 

方式二:將全部awk命令插入一個文件,並使阿瓦庫程序可執行,而後用awk命令解釋器做爲腳本的首行,以便經過鍵入腳本名成功來調用它.

 

方式三:將全部的awk命令插入一個單純文件,而後調用:

awk -f awk-script-file input-file(s)

-f選項指明在文件awk_script_file中的awk腳本,input_file(s)是使用awk進行瀏覽的文件名.

 

 

模式和動做

 

任何awk語句都是有模式和動做組成.在一個awk腳本中可能有不少語句,模式部分決定動做語句什麼時候觸發以及出發時間.處理即對數據進行的操做.若是省略模式部分,動做將時刻保持執行狀態.模式能夠是任何條件語句或符合語句或正則表達式.模式包括兩個特殊字段BEGIN和END.使用BEGIN語句設置計數和打印頭.BEGIN語句使用在任何文本瀏覽動做以前,以後文本瀏覽動做一句輸入文本開始執行.END語句用來在awk完成瀏覽動做後打印輸出文本總數和結尾狀態標識.

 

域和記錄

使用$1,$3表示參照第一個和第三個域,注意這裏使用逗號作域分割,若是但願打印一個有5個域的記錄的全部域,可以使用$0,意即全部域.

爲打印一個域或全部域,使用printf命令,這是一個awk動做

 

模式和動做

模式:兩個特殊段BEGIN和END

動做:實際動做大多在{}內指明

 

輸出:

1.抽取域

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

輸出:打印/etc/passwd目錄下的全部用戶名

 

2.保存輸出

awk -F: ‘{print $1}’ /etc/passwd |tee user  使用tee命令,在輸出文件的同時,輸出到屏幕

 

3.使用標準輸出

awk -F : ‘{print $1}’ /etc/passwd > user3

 

4.打印全部記錄

awk -F : ‘{print $0}’ /etc/passwd

5.打印單獨記錄

awk -F: ‘{print $1,$4}’ /etc/passwd

 

6.打印報告頭

awk -F : ‘BEGIN{print 「NAME\n」}{print $1}’ /etc/passwd

 

7.打印結尾

awk -F: ‘{print $1}END{print 「this is all users\n」}’ /etc/passwd

 

條件操做符

1.匹配

awk -F : '{if($1~/root/) print}' /etc/passwd 

分析:if($1~/roo/t) 表示若是file中包含root,打印他

 

2.精確匹配

使用符號==

awk -F: '{if($3==0) print}' /etc/passwd

 

3.不匹配

!~

awk -F: '{if($1!~/linuxone/) print}' /etc/passwd

精確不匹配

!=

awk -F: '{if($1!=/linuxone/) print}' /etc/passwd

 

4.小於

<

5.小於等於

<=

6.大於

>

7.設置大小寫

awk ‘/[Rr]oot’ /etc/passwd

 

8.任意字符

awk -F : '{f($1~/^...t/) print}' /etc/passwd

分析:if($1~/^...t/)表示第四個字母是t

 

9.或關係匹配

awk -F : '{if($1~/(squid|nagios)/) print}' /etc/passwd

 

10.行首

awk '/^root/' /etc/passwd

分析:^root(行首包含root)

11 AND &&

awk -F : '{if($1=="root"&&$3=="0") print}' /etc/passwd

 

12.OR ||

 

內置變量:

變量名
含義
ARCC
命令行參數個數
ARGV
命令行參數列表
ENV |RON
支持隊列中的系統環境變量的使用
FNR
瀏覽文件的記錄數
FS
置頂分隔符,等價於-F
NF
瀏覽記錄的域的個數
NR
一度的記錄數
OFS
輸出域分隔符
ORS
輸出記錄分隔符
RS
控制記錄分隔符
 

案例:

打印有多少行記錄

awk 'END{print NR}' /etc/passwd

 

設置輸入域到變量名

awk -F : '{name=$1;path=$7; if(name~/root/)print name"\tpath is : " path}' /etc/passwd

 

域值比較操做

awk '{if($6<$7) print $0}' input-file

 

修改文本域只顯示修改的記錄

awk -F : '{if($1=="root"){$1="nagios server" ; print}}' /etc/passwd  

 

文件長度相加

ls -l | awk '/^[^d]/ {print $9"\t" $5}{tot+=$5}\

 END {print "total kb:"tot}'

 

 

 

 

內置的字符串函數

gsub(r,s)
在整個$0中s替換r
gsub(r,s,t)
在整個t中s替換r
index(s,t)
返回s中字符串t的第一位置
length(s)
返回s長度
match(s,r)
測試s中是否包含匹配r的字符串
split(s,a,fs)
在fs上將s分紅序列a
sub(s,)
用$0中最左邊也是最長的字符串替代
subtr(s,p)
返回字符串s中從p開始的後綴部分
substr(s,p,n)
返回字符串s中從p開始長度爲n的後綴部分
 

1.gsub

awk 'gsub(/^root/,"netseek") {print}' /etc/passwd  #將以root開頭的字符串替換爲netseek並打印

 

awk 'gsub(/0/,2){print}' /etc/passwd

 

awk '{print gsub(/0/,2) $0}' /etc/fstab

 

2.index

awk 'BEGIN{print index("root","o")}'  #查詢o在root字符串中出現的第一位置

 

awk -F : '$1=="root" {print index($1,"o")" " $1}' /etc/passwd

 

awk -F : '{print index($1,"o") $1}' /etc/passwd

 

3.length

awk -F : '{print length($1)}' /etc/passwd

 

wk -F : '$1=="root"{print length($1)"\t" $0}' /etc/passwd

 

4.match(在ANCD中查找C的位置)

awk 'BEGIN{print match("ANCD","C")}'

 

5.split返回字符串數組元素個數

awk 'BEGIN{print split("123#456#789",array,"#")}'

 

6.sub只能替換指定域的第一個0

awk 'sub(/0/,2){print }' /etc/fstab

 

7.substr 按照起始位置以及長度返回字符串的一部分

awk 'BEGIN{print substr("www.baidu.com",5,9)}' #第五個子夫開始,取9個字符

 

awk 'BEGIN{print substr("www.baidu.com",5)}'  #第五個位置開始,一直到最後

 

字符串屏蔽序列

符號
含義
\b
退格符
\f
走紙換頁
\n
新行
\r
回車
\t
tab鍵(四個空格)
\c
任意其餘特殊字符
\ddd
八進制
 

案例:

awk -F : '{print $1,"\b" $2,"\t" $3}' /etc/passwd

分析:print和printf二者效果不一樣

 

printf修飾符

-  : 左對齊

width : 域的步長0表示0步長

.prec : 最大字符串長度,或小數點右邊的位數

 

awk printf格式

符號
含義
%c
ASCII字符
%d
整數
%e
科學計數法
%f
浮點數
%g
awk決定使用哪一種浮點數轉換,e或者f
%o
八進制數
%s
字符串
%x
十六進制
 

1.字符串轉換

echo "65" | awk '{printf "%c\n", $0}'

 

awk 'BEGIN{printf "%c\n" ,65}'

 

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

 

2.格式化輸出

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

 

awk -F : 'BEGIN{printf "USER\t\tUID\n"}{printf "%-15s %s\n",$1,$3}' /etc/passwd

 

3.向一行awk命令傳值

who | awk '{if ($1==user) print $1 " you are connected :" $2}' user=$LOGNAME

 

4.awk腳本文件(在文件名字後面加後綴.awk翻遍區分)

#!/bin/awk -f

BEGIN{

        FS=":"

        print "User\t\tUID"

        print "----------------"

}

 

{printf "%-15s %s\n",$1,$3}

 

END{

        print "end"

}

 

分析:awk腳本文件開頭通常都是這樣的:#!/bin/awk -f


已經指明瞭 -f 選項。


執行時,直接在awk腳本名後面加要處理的文件名做爲參數便可。
相關文章
相關標籤/搜索