1. 程式人生 > 實用技巧 >Linux自學筆記——awk文字處理工具

Linux自學筆記——awk文字處理工具


GUN awk

文字處理三劍客:grep,sed,awk

grep,egrep,fgrep:文字過濾工具:pattern

sed:行編輯器

模式空間、保持空間

awk:Aho,Weinberger,Kernighan –-> New AWK,NAWK

GNU awk,gawk

下面一起來看看awk的基本語法及具體應用;

gawk – pattern scanning andprocessing language

基本用法:gawk [option]‘program’FILE…

program:PATTERN{ACTION STATEMENTS}

語句之間用分號分隔

print,printf

選項:

-F:指明輸入時用到的欄位分隔符;

-v var=value:自定義變數;

1.print

print item1,item2,…

要點:

1)逗號分隔符;

2)輸出的各item可以字串,也可以是數值;當前記錄的欄位、變數或awk的表示式;

3)如省略item,相當於print $0;

2.變數

2.1內建變數

FS:input field separator,預設為空白字元;

OFS:output field seperator,預設為空白字元;

RS:input record separator,輸入時的換行符;

ORS:output record separator,輸出時的換行符;

NF:number of field,欄位數量

{print NF},{print $NF}

NR:number of record,行數;

FNR:各檔案分別計數;行數;

FILENAME:當前檔名;

ARGC:命令列引數的個數;

ARGV:陣列,儲存的命令列所給定的各引數;

2.2自定義變數

1) –v var=value

變數名區分字元大小寫;

2) 在program中直接定義

3.printf命令

格式化輸出:printf FORMAT,item1,item2,…

1)FORMAT必須給出;

2)不會自動換行,需要顯式給出換行控制符,\n

3)FORMAT中需要分別為後面的每個item指定一個格式化符號;

格式符:

%c:顯示字元的ASCII碼;

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

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

%f:顯示為浮點數;

%g,%G:以科學計數法或浮點形式顯示數值;

%s:顯示字串;

%u:無符號整數;

%%:顯示%自身

修飾符:

#[.#]:第一個數字控制顯示的寬度;第二個#表示小數點後的精度;例如:%3.1f

-:左對齊

+:顯示數值的符號

4.操作符

算術操作符

X+y,x-y,x*y,x/y,x^y,x%y

+x:轉換為數值

字串操作符:沒有符號的操作符,字串連線

賦值操作符:

+,+=,-=,*=,/=,%=,^=

++,--

比較操作符:

>,>=,<,<=,!=,==

模式匹配符:

~:是否匹配

!~:是否不匹配

邏輯操作符:

&&

||

函式呼叫:

function_name(arg1,arg2,…)

條件表示式:

selector?if-true-expression:if-false-expression

wKiom1nbImPQ8BgbAABPerwxq9I752.png-wh_50

5.PATTERN

1)empty:空模式,匹配每一行;

2)/regular expression/:僅處理能夠被此處的模式匹配到的行;

3)relation1 expression:關係表示式;結果有真有假;結果為真才會被處理;

真:結果為非0值,非空字串;

4)line ranges:行範圍,startline,endline:/pat1/,/pat2/

注意:不支援直接給出數字的格式

示例:列印/etc/passwd裡的第2到第10個使用者

wKioL1nbIhuQjuj9AAAXYfoMejA143.png-wh_50

5)BEGIN/END模式

BEGIN{}:僅在開始處理檔案中的文字之前執行一次;

END{}:僅在文字處理完成之後執行一次;

6.常用的action

1)expressions

2)control statements:if,while等;

3)compound statements:組合語句;

4)input statements

5)output statements

7.控制語句

if(condition) {statements}

if(condition) {statements} else {statements}

while(condition) {statements}

do {statements} while(condition)

for(expr1;expr2;expr3) {statements}

break

continue

delete array[index]

delete array

exit

{ statements }

7.1 if-else

語法:if(condition) statement[else statement]

示例1:將系統中的所有使用者分類,id號大於1000的打印出普通使用者,否則打印出root或系統使用者;

wKioL1nbIiXD0xa7AABEyQFg7TA398.png-wh_50

示例2:打印出使用bash的使用者;

wKioL1nbIi3A2T9xAAAbzXxsEOk586.png-wh_50

示例3:打印出欄位大於5的行

wKiom1nbIx2QgSS1AABN8wKtbm4130.png-wh_50

示例4:打印出磁碟用量超過百分之20的磁碟

wKiom1nbIzfQ9yi2AAAUc0W7nHc276.png-wh_50

使用場景:對awk取得的整行或某個欄位做條件判斷;

7.2 while迴圈

語法:while(condition) statement

條件“真”,進入迴圈;條件“假”,退出迴圈;

使用場景:對一行內的多個欄位逐一類似處理時使用;對陣列中的各元素逐一處理時使用;

示例:從/etc/grub.conf檔案中取出,以任意空格開頭,後面緊跟kernel的行,並將其欄位大於7的欄位和欄位的字元數打印出來;

wKiom1nbI0DB_hCZAABjwzTinZE581.png-wh_50

7.3 do-while迴圈

語法:do statement while(condition)

意義:至少執行一次迴圈體

7.4 for迴圈

語法:for(expr1;expr2;expr3) statement

for(variable assignment;condition;iteration process) {for-body}

wKiom1nbI0qhF0bJAABmFQMrLMM817.png-wh_50

特殊用法;

能夠遍歷陣列中的元素:

語法:for(var in array) {for-body}

7.5 switch語句

語法:switch(expression) {case VALUE1 or /REGEXP/:statement;case VALUE2 or /REGEXP2/:statement;…;default:statement}

7.6 break和continue

break[n]

continue

7.7 next

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

示例:列印/etc/passwd偶數行

wKioL1nbIwWg_wYUAAA3gux-kzQ444.png-wh_50

8. array

關聯陣列:array[index-expression]

Index-expression

1)可使用任意字串;字串要使用雙引號;

2)如果某陣列元素事先不存在,在引用時,awk會自動建立此元素,並將其值初始化為“空串”

若要判斷陣列中是否存在某元素,要使用“index in array”格式進行;

weekdays[mon]="Monday"

若要遍歷陣列中的每個元素,要使用for迴圈:

for(var in array) {for-body}

示例:列印陣列元素:

wKiom1nbI2SRF8f0AAAZ7X2Gqok850.png-wh_50

注意:var會遍歷array的每個索引;

state[“LISTEN”]++

state[“ESTABLISHED”]++

示例:統計tcp協議狀態及相應個數:

wKiom1nbI22BEhfbAABV3jrItck149.png-wh_50

練習1:統計/etc/fstab檔案中每個檔案系統型別出現的字數;

wKioL1nbIyWRASUOAAAZjPfQJAY430.png-wh_50

練習2:統計指定檔案中每個單詞出現的次數;

wKioL1nbIy_TtbjJAAB1SVEgBZA011.png-wh_50

9.函式

9.1內建函式

數值處理:

rand():返回0和1之間的一個隨機數;

字串處理:

length([s]):返回指定字串的長度;

sub(r,s,[t]):以r表示的模式來查詢t所表示的字元中的匹配的內容,並將其第一次出現替換為s所表示的內容;

gsub(r,s,[t]):以r表示的模式來查詢t所表示的字元中的匹配的內容,並將其所有出現均替換為s所表示的內容;

split(s,a[,r]):以r為分隔符切割字元s,並將切割後的結果儲存至a所表示的陣列中;

wKiom1nbI43imfCqAAAgEHiK0lo465.png-wh_50


轉載於:https://blog.51cto.com/claude666/1970930