awk 從入門到精通

2021-08-08 04:13:17 字數 4578 閱讀 9921

1、簡介

主要用來處理文字資料,處理效率高於shell,**簡潔高效,絕對不會遇到記憶體溢位

2、命令處理模式:

按行處理,一行一行執行(和shell一樣)

3、命令格式:

awk [-f|-f|-v] 『begin{} // end{}』 file

-f指定分隔符 -f呼叫指令碼 -v定義變數 var=value

' ' 引用**塊(''單引號)

begin 初始化**塊,在對每一行進行處理之前,初始化**,主要是引用全域性變數,設定fs分隔符

// 匹配**塊,可以是字串或正規表示式

{} 命令**塊,包含一條或多條命令

; 多條命令使用分號分隔

end 結尾**塊,在對每一行進行處理之後再執行的**塊,主要是進行最終計算或輸出結尾摘要資訊

4、awk正則:

$0           當前所在行

$n 每行第n個字段(列印列) n可以換成任一正整數

nf 字段數量變數

nr 每行的記錄號,多檔案記錄遞增

fnr 與nr類似,不過多檔案記錄不遞增,每個檔案都從1開始

\t 製表符

\n 換行符

fs begin時定義分隔符

rs 輸入的記錄分隔符, 預設為換行符(即文字是按一行一行輸入)

~ 匹配,與==相比不是精確比較

!~ 不匹配,不精確比較

== 等於,必須全部相等,精確比較

!= 不等於,精確比較

&&  邏輯與

|| 邏輯或

+ 匹配時表示1個或1個以上

/[0-9][0-9]+/ 兩個或兩個以上數字

/[0-9][0-9]*/ 乙個或乙個以上數字

filename 檔名

ofs 輸出字段分隔符, 預設也是空格,可以改為製表符等

ors 輸出的記錄分隔符,預設為換行符,即處理結果也是一行一行輸出到螢幕

-f'[:#/]' 定義三個分隔符

-f":#/"

5、awk呼叫方式

1.命令列方式

awk [-f  field-separator]  'commands'  input-file(s)
其中,commands 是真正awk命令,[-f域分隔符]是可選的。 input-file(s) 是待處理的檔案。

在awk中,檔案的每一行中,由域分隔符分開的每一項稱為乙個域。通常,在不指名-f域分隔符的情況下,預設的域分隔符是空格。

2.shell指令碼方式

將所有的awk命令插入乙個檔案,並使awk程式可執行,然後awk命令直譯器作為指令碼的首行,一般通過鍵入指令碼名稱來呼叫。

相當於shell指令碼首行的:#!/bin/sh

可以換成:#!/bin/awk

3.將所有的awk命令插入乙個單獨檔案,然後呼叫:

awk -f awk-script-file input-file(s)
其中,-f選項載入awk-script-file中的awk指令碼,input-file(s)跟上面的是一樣的

6、操作

最近登入賬戶的檢視:(-f指定分隔符僅支援:不加"",其它分隔符不加""全部不識別)

last -n 2 | awk  ''		//print列印指定內容

awk '' /etc/passwd 等於 awk '' /etc/passwd 等於 cat /etc/passwd

awk '' /etc/passwd //不輸出passwd的內容,而是輸出相同個數的空行,進一步解釋了awk是一行一行處理文字

awk '' /etc/passwd //輸出相同個數的a行,一行只有乙個a字母

awk -f":" '' /etc/passwd

awk -f: '' /etc/passwd

awk -f'[:]' '' /etc/passwd

awk -f"/" '' /etc/passwd

awk -f: '' /etc/passwd(換行顯示) 等於 awk -f: ''(不換行) /etc/passwd//將每一行的前二個字段,分行輸出,進一步理解一行一行處理文字

awk -f: '' ofs="\t" /etc/passwd //指定以tab鍵分隔第1,3,6個字段 ofs指定分隔符

7、變數:-v

(1)內建變數

argc               命令列引數個數

argv 命令列引數排列

environ 支援佇列中系統環境變數的使用

filename awk瀏覽的檔名

fnr 瀏覽檔案的記錄數

fs 設定輸入域分隔符,等價於命令列 -f選項

nf 瀏覽記錄的域的個數

nr 已讀的記錄數

ofs 輸出域分隔符-f

ors 輸出記錄分隔符

rs 控制記錄分隔符

統計/etc/passwd:檔名,每行的行號,每行的列數,對應的完整行內容:

#awk  -f '/'  '' /etc/passwd

filename:/etc/passwd,linenumber:29,columns:6,linecontent:saslauth:x:498:76:saslauthd user:/var/empty/saslauth:/sbin/nologin

filename:/etc/passwd,linenumber:30,columns:6,linecontent:postfix:x:89:89::/var/spool/postfix:/sbin/nologin

filename:/etc/passwd,linenumber:31,columns:6,linecontent:pulse:x:497:496:pulseaudio system daemon:/var/run/pulse:/sbin/nologin

filename:/etc/passwd,linenumber:32,columns:6,linecontent:sshd:x:74:74:privilege-separated ssh:/var/empty/sshd:/sbin/nologin

filename:/etc/passwd,linenumber:33,columns:4,linecontent:tcpdump:x:72:72::/:/sbin/nologin

列印:檔名,行數,字段數,當前行內容:

awk  -f ':'  '' /etc/passwd

awk -f ':' '' /etc/passwd

awk -f ':' '' /etc/passwd

%10s:

輸入時,%10s表示最多接受10個字元,多餘的忽略;

輸出時,%10s表示字串長度不足10個時,左邊補空格,保證佔10個位元組位置,10個及以上原樣輸出.

print和printf:

awk中同時提供了print和printf兩種列印輸出的函式。

print函式的引數:變數、數值或者字串。(字串必須用""引用,引數用,分隔。如果沒有, ,引數就串聯在一起而無法區分。這裡,逗號的作用與輸出檔案的分隔符的作用是一樣的,只是後者是空格而已。)

printf函式,其用法和c語言中printf基本相似,可以格式化字串,輸出複雜時,printf更加好用,**更易懂。

(2)自定義變數:

統計虛擬機器/etc/passwd使用者數量:

awk ' end' /etc/passwd
8、awk實現wordcount(詞頻統計)案例

vi a.log

my name is hahah .

14 years old

執行方式一:

vi wc.awk

end執行:

awk -f wc.awk a.log

執行方式二:

vi wordcount_awk.sh

#!/bin/sh

awk -f " " '

end' $1

執行:chmod u+x wordcount_awk.sh

./wordcount_awk.sh f.txt

9、列印九九乘法表

seq 9 | sed 'h;g' | awk -v rs='' ''

Nginx從入門到精通

1 nginx配置檔案載入機制 採用nginx s reload命令載入nginx的配置檔案,master程序讀取配置檔案,建立新的worker程序,向老的worker程序傳送shutdown命令。老的worker程序不再接受新的請求,待老的請求處理完成後,就會停掉。2 location匹配機制 當...

scrot 從入門到精通

無論是撰寫技術教程,還是展示桌面或應用,恐怕 scrot 都是必不可少的工具。scrot 是螢幕抓圖工具中的 皎皎 佼佼者,它小巧而不失為強大,精練而不缺少靈活。scrot 主要用在命令列下,它使用 imlib2 庫來抓取並儲存影象。在 ubuntu 中,可以使用sudo apt get insta...

mysql從入門到精通

在sql語言中,用join實現表與表的關聯,用on指定聯合表的查詢條件,如 實現三表聯查,可以用table1.table2.來排列 顯示資訊的先後順序 select from user left join address on user id address.user id left join us...