awk(報告生成器)詳解

2021-10-02 20:00:19 字數 3755 閱讀 1974

awk是乙個強大的文字分析工具,相對於grep的查詢,sed的編輯,awk在其對資料分析並生成報告時,顯得尤為強大。簡單來說awk就是把檔案逐行的讀入,以空格為預設分隔符將每行切片,切開的部分再進行各種分析處理。

awk a.k.a. aho, kernighan and weinberger(awk的三位創始人)

awk [options]

'pattern ' file1 file2,

...awk [options]

'begin patternend' file ...

.

awk程式通常由:begin語句塊、能夠使用模式匹配的通用語句塊、end語句塊三部分組成。

options:

-

f:指明輸入時用到的字段分隔符

-v var

=value :自定義變數

-f: scripfile or --file scriptfile 從指令碼檔案中讀取awk命令。

awk變數

fs

: field separator,讀取檔案本時,所使用字段分隔符。

rs: record separator,輸入文字資訊所使用的換行符。

ofs: output filed separator: 輸出字段分割符。

ors:output row separator:輸出行分割符。

nr: the number of input records,awk命令所處理的記錄數(行數)。如果有多個檔案,這個數目會把處理的多個檔案中行統一計數。

nf:number of field,當前記錄的field個數、一條記錄的字段數目。

fnr: 與nr不同的是,fnr用於記錄正處理的行是當前這一檔案中被總共處理的行數。

$0:完整的輸入記錄

$n:當前記錄的第n個字段,欄位間由fs分隔

argc

:命令列引數的數目

ar**

:包含命令列引數的陣列

filename

:當前檔名

print和printf

print和printf都是列印輸出的,不過兩者用法和顯示上有些不同而已。

print 格式:print item1,item2,

...printf格式:printf 「format 」,item1,item2,

...

1.逗號為分隔符時,顯示的是空格。

2.分隔符分隔的字段(域)標記稱為域標識,用$0

,$1,$2

,...

,$n表示。

3.輸出的各item可以字串,也可以是數值,當前記錄的字段,變數或awk 的表示式等。

4.如果省略了item ,相當於print $0。

5.對於printf來說,必須指定format,即必須指出後面每個itemsn的輸出格式,且還不會自動換行,需要顯式則指明換行控制符"\n"。

printf的格式符和修飾符:

format格式的指示符都以%開頭,後跟乙個字元;如下:

%c: 顯示字元的ascii碼;

%d,%i:十進位制整數;

awk 『』 /etc/passwd

%e,%

e:科學計數法顯示數值;

%f: 顯示浮點數;

%g,%

g: 以科學計數法的格式或浮點數的格式顯示數值;

%s: 顯示字串;

%u: 無符號整數;%%

: 顯示%自身;

修飾符:

n: 顯示寬度;

-: 左對齊;

+:顯示數值符號;

[root@localhost ~

]# awk -f:

''/etc/passwd

要列印的字串放置在兩個雙引號之間「format」。

第乙個格式說明符是%

-15s,它對應的引數是$1,緊挨著控制串的右半邊引號後面的那個逗號。

百分號引出格式說明:短劃線表示左對齊,15s表示佔15格的字串。這條命令用來列印乙個左對齊、佔15格的字串。

awk的控制語句

if

-else

語法:if

(condition)

else

例子:awk -f:

''/etc/passwd

awk -f:

''/etc/passwd

awk -f:

-v sum=

0'end'

/etc/passwd

while

語法: while

(condition)

awk -f:

'}'/etc/passwd

awk -f:

'; i++ }}'

/etc/passwd do-

while

語法: do

while

(condition)

awk -f:

'while(i<=3)}'

/etc/passwd

for語法: for

( variable assignment; condition; iteration process)

awk -f:

''/etc/passwd

awk -f:

'}}'

/etc/passwd

for迴圈還可以用來遍歷陣列元素:

語法: for

(i in array)

awk -f:

'$nf!~/^$/end}'

/etc/passwd

case

語法:switch

(expression)

break 和 continue

常用於迴圈或case語句中

next

awk -f:

''/etc/passwd

awk的內建函式

rand

():返回0 和1 之間乙個隨機數

srand

():生成隨機數種子

int(

):取整數

length

([s]

):返回指定字串的長度

sub(r,s,

[t]):對t字串進行搜尋,r表示的模式匹配的內容,並將第乙個匹配的內容替換為s

gsub

(r,s,

[t]):對t字串進行搜尋,r表示的模式匹配的內容,並全部替換為s所表示的內容

split

(s,array,

[r]):以r為分隔符,切割字串s,並將切割後的結果儲存至array 所表示的陣列中,第乙個索引值為1

, 第二個索引值為2

,…也就是說awk的陣列下標是從1開始編號的。

substr

(s,i,

[n]):從s所表示的字串中取子串,取法:從i表示的位置開始,取n個字元。

systime

():取當前系統時間,結果形式為時間戳。

system

():呼叫shell中的命令。空格是awk中的字串連線符,如果system 中需要使用awk中的變數可以使用空格分隔,或者說除了awk的變數外其他一律用""引用 起來。

awk報告生成器

awk,aho,weinberger,kernighan gawk,gnu awk 我們在linux 上使用的 awk其實是 gawk 的鏈結檔案 gawk options program file program pattern 語句之間用分號分割 ps options f 指明輸入時用到的字段分...

Linux Shell程式設計 awk 報告生成器

awk 處理機制 awk 會逐行處理文字,支援在處理第一行之前做一些準備工作以及在處理完最後一行做一些總結性質的工作,在命令格式上分別體現如下 begin 讀入第一行文字之前執行,一般用來初始化操作 逐行處理,逐行讀入文字執行相應的處理,是最常見的編輯指令 end 處理完最後一行文字之後執行,一般用...

Shell中的awk報告生成器

一.awk 報告生成器 awk的處理機制 awk會逐行處理文字,支援在處理第一行之前做一些準備工作,以及在處理完最後一行做一些總結性質的工作,在命令格式上分別體現如下 begin 讀入第一行文字之前執行,一般用來初始化操作 逐行處理,逐行讀入文字執行相應的處理,是最常見的編輯指令 end 處理完最後...