1. 程式人生 > >Linux三劍客——awk

Linux三劍客——awk

-- 條件 文件 3.1 範圍 區別 linux三劍客 ber new

Linux三劍客——awk

DKing~共享

1.1 awk執行過程

awk讀入第一行內容

判斷是否符合模式中的條件NR>=2(是否讓你進入大門)

如果匹配則執行對應的動作{print $0}

如果不匹配條件,繼續讀取下一行

繼續讀取下一行

重復以上過程,直到讀取到最後一行(EOFend of field

1.2 記錄和字段

record 表示記錄、行 記錄相當於行

field 表示區域、字段 字段相當於列

1.2.1 記錄(行)

awk默認情況下每一行都是一個記錄(record

RSrecord separator)是輸入數據記錄分隔符,表示每個記錄輸入的時候的分隔符,即行與行之間如何分隔,即

RS表示每行的結束標誌

NRnumber of record)記錄行號,表示當前正在處理的記錄(行)的號碼,讀取新行時候會自動+1

ORSoutput record separator)輸出記錄分隔符

awk使用內置變量RS來存放輸入記錄分隔符,RS表示的是輸入的記錄分隔符,可通過BEGIN模塊重新定義

1.2.2 字段(列)

技術分享圖片

每條記錄都是由多個區域(field)組成的,默認情況下區域之間的分隔符是由空格來分隔,並且將分隔符記錄在內置變量FS中,每行記錄的區域數保存在awk的內置變量NF

FSfield separator)輸入字段(列)分隔符,分隔符就是菜刀,把一行字符串切割成多個區域

awk -F 實際上就是修改

FS的內容,相當於 awk 'BEGIN{FS=":"}'

NFnumber of fields)表示一行中字段(列)的個數,即每行有多少列

OFS輸出字段(列)分隔符

$符號表示取某個列,$1 $2 $NF

通過RSFS決定awk如何讀取數據,還可以修改ORSOFS的值指定awk如何輸出數據,下圖示例:

技術分享圖片

1.3 awk新增的參數和符號

~ 表示匹配,包含

!~ 表示不匹配,不包含

gsub 函數,用於替換

gsub /你要找什麽/,“替換成什麽”,第幾列

i=i+1 等同於i++ 統計次數

i=i+$n i+=$n 累加總和

-v var=value 賦值一個用戶定義變量,將外部變量傳遞給awk

1.3.1 gsub的替換功能

# awk '{gsub(/:/,"¥",$NF);print}' reg.txt

Zhang Dandan 41117397 ¥250¥100¥175

Zhang Xiaoyu 390320151 ¥155¥90¥201

gsub函數

gsub(/你要找什麽/,“替換成什麽”,第幾列)

1.3.2 i++統計次數

# seq 10 |awk '{i=i+1;print i}' 統計次數並顯示過程

# seq 10 |awk '{i=i+1}END{print i}' 統計次數只顯示最終結果

i=i+1可用i++表示

# seq 10 |awk '{i=i+$1}END{print i}' 計算第1列次數總和

# seq 10 |awk '{i+=$n}END{print i}' i+=$n等同於i=i+$n

1.4 awk模式與動作

awk [ options ] 'pattern {action}' file

awk參數 模式動作

通俗講就是給定條件然後去做什麽,awk 找誰{幹啥}’‘模式{動作}

awk的常用模式:

正則表達式作為模式 支持BRE ERE

比較表達式作為模式 NR>10

範圍模式

特殊模式BEGINEND

1.4.1 正則表達式作為模式:

技術分享圖片

技術分享圖片

實例1-1 從具體某一列中查找內容

# awk '$3~/0+/' /server/files/reg.txt

Zhang Xiaoyu 390320151 :155:90:201

實例1-2 $(NF-1)$NF-1的區別

# awk -F '[: ]+' '/Zhang/{print $1,$2,$(NF-1)}' reg.txt

Zhang Dandan 100

Zhang Xiaoyu 90

# awk -F '[: ]+' '/Zhang/{print $1,$2,$NF-1}' reg.txt

Zhang Dandan 174

Zhang Xiaoyu 200

1.4.2 範圍模式

範圍模式簡單理解就是從哪裏來,到哪裏去

匹配從條件1開始到條件2介紹的範圍

# awk 'NR==1,NR==3' reg.txt

Zhang Dandan 41117397 :250:100:175

Zhang Xiaoyu 390320151 :155:90:201

Meng Feixue 80042789 :250:60:50

1.5 awk數組

以數字做索引,方便快捷查詢內容,數組索引可以是數字和字符串。在awk中數組叫做關聯數組(associative arrays)awk 中的數組不必提前聲明,也不必聲明大小。數組元素用0或空字符串來初始化,這根據上下文而定。

# awk 'BEGIN{h[1]="dou";h[2]="qin";h[3]="feng";print h[1],h[2],h[3]}'

dou qin feng

1.5.1 分析用戶登錄日誌

找出攻擊者ip地址和攻擊次數

# awk '$6~/Failed/{h[$(NF-3)]++}END{for( pol in h ) print pol,h[pol]}' secure-20161219 |sort -nk2|column -t|tail

找出被攻擊用戶和攻擊次數

# awk '$6~/Failed/{h[$(NF-5)]++}END{for( pol in h ) print pol,h[pol]}' secure-20161219 |sort -nk2|column -t|tail

1.5.2 排序命令小結

1.5.3 sort

sort 將文件進行排序

-b:忽略每行前面開始出的空格字符;

-c:檢查文件是否已經按照順序排序;

-d:排序時,處理英文字母、數字及空格字符外,忽略其他的字符;

-f:排序時,將小寫字母視為大寫字母;

-n:依照數值的大小排序;

-o<輸出文件>:將排序後的結果存入制定的文件;

-r:以相反的順序來排序;

1.5.4 uniq

uniq 用於報告或忽略文件中的重復行,一般與sort命令結合使用

-c或——count:在每列旁邊顯示該行重復出現的次數;

-d或--repeated:僅顯示重復出現的行列;

-u或——unique:僅顯示出現一次的行列;

1.5.5 column

column 縱向列表

-t 以空格為標桿自動對齊

技術分享圖片


Linux三劍客——awk