Linux三劍客——awk
DKing~共享
1.1 awk執行過程
awk讀入第一行內容
判斷是否符合模式中的條件NR>=2(是否讓你進入大門)
如果匹配則執行對應的動作{print $0}
如果不匹配條件,繼續讀取下一行
繼續讀取下一行
重復以上過程,直到讀取到最後一行(EOF:end of field)
1.2 記錄和字段
record 表示記錄、行 記錄相當於行
field 表示區域、字段 字段相當於列
1.2.1 記錄(行)
awk默認情況下每一行都是一個記錄(record)
RS(record separator)是輸入數據記錄分隔符,表示每個記錄輸入的時候的分隔符,即行與行之間如何分隔,即
NR(number of record)記錄行號,表示當前正在處理的記錄(行)的號碼,讀取新行時候會自動+1
ORS(output record separator)輸出記錄分隔符
awk使用內置變量RS來存放輸入記錄分隔符,RS表示的是輸入的記錄分隔符,可通過BEGIN模塊重新定義
1.2.2 字段(列)
每條記錄都是由多個區域(field)組成的,默認情況下區域之間的分隔符是由空格來分隔,並且將分隔符記錄在內置變量FS中,每行記錄的區域數保存在awk的內置變量NF中
FS(field separator)輸入字段(列)分隔符,分隔符就是菜刀,把一行字符串切割成多個區域
awk -F 實際上就是修改
NF(number of fields)表示一行中字段(列)的個數,即每行有多少列
OFS輸出字段(列)分隔符
$符號表示取某個列,$1 $2 $NF
通過RS、FS決定awk如何讀取數據,還可以修改ORS、OFS的值指定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
範圍模式
特殊模式BEGIN和END
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