Linux三劍客文本處理&AWK

awk簡介
awk是一個強大的文本分析工具,與grep(查找)、sed(編輯)一併稱爲“文本處理三劍客”。awk最強大的功能是對數據分析並生成報告。
awk有3個不同版本: awk、nawk和gawk,未作特別說明,一般指gawk,gawk是AWK的GNU版本。
awk其名稱得自於它的創始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首個字母。awk能讀取輸入文件、爲數據排序、處理數據、對輸入執行計算以及生成報表,還有無數其他的功能。
工作原理
一次讀取一行文本,按輸入分隔符進行切片,切成多個組成部分,將每片直接保存在內建的變量中,$1,$2,$3….,引用指定的變量,可以顯示指定斷,或者多個斷。如果需要顯示全部的,需要使用$0來引用。可以對單個片斷進行判斷,也可以對所有斷進行循環判斷。其默認分隔符爲空格

按行讀取文本(文件的每一行稱爲記錄)
按輸入分隔符進行切片
對切片自動生命變量 $1,$2…(域標識;$0爲所有域)
對指定目標做處理(處理及打印等)

語法格式
awk [options] ‘program’ FILE……
[options]

–F:指明輸入時的分隔符

–v:自定義變量

–f:調用awk腳本

program:pattern{action statements;…}

-pattern:觸發條件

-action statements:對數據處理動作
步驟
執行BEGIN{action;…}
BEGIN在輸入之前執行,通常用來打印表頭,變量初始化。
讀取,執行pattern{action;…}
默認執行{ print }
執行END{action;…}
讀取到打印結束後執行,通常用作分析結果,信息彙總。
變量
內置變量

FS:輸入字段分隔符
OFS:輸出字段分隔符
RS:輸入記錄分隔符
ORS:輸出記錄分隔符
ARGC:命令行參數的個數
ARGV:數組,保存命令行給定的各參數
NF:字段數量
NR:行號
FNR:個文件分別計數,行號
FILENAME:當前文件名

自定義變量

選項位置定義:-v var=hello
在program中定義:awk ‘BEGIN{test=”hello”;print test}’

字符串處理

length([s]) :返回指定字符串的長度
sub(r,s,[t]) :對t字符串進行搜索r 表示的模式匹配的內容,並將第一個匹配的內容替換爲s

echo “2008:08:08 08:08:08″ | awk ‘sub(/?,”-“,$0)’
gsub(r,s,[t]) :對t字符串進行搜索r表示的模式匹配的內容,並全部替換爲s所表示的內容

echo “2008:08:08 08:08:08″ | awk ‘gsub(/?,”-“,$0)’
split(s,array,[r]) :以r爲分隔符,切割字符串s,並將切割後的結果保存至array 所表示的數組中,第一個索引值爲1, 第二個索引值爲2,…

netstat -tan | awk ‘/^tcp>/{split($5,ip,”:”);count[ip[1]]++} END{for (i in count) {print i,count[i]}}’

Printf命令

print不需要指定,printf需要指定format
printf後面的字串需要使用雙引號
字串定義後的內容需要使用”,”分隔,後面直接跟Item1,item2….
format用於指定後面的每個item的輸出格式
printf語句不會自動打印換行符\n

格式符

%s: 顯示字符串
%d,%i: 顯示十進制整數
%e,%E: 科學計數法數值顯示
%f: 顯示爲浮點數
%g,%G: 以科學數法或浮點形式顯示數值
%c: 顯示字符的ASCII碼
%u: 無符號整數
%%: 顯示%號自身,相當於轉義

修飾符

N: 顯示寬度
-: 左對齊(默認爲右對齊)
+: 顯示數值符號

操作符

算數

x+y, x-y, x*y, x/y, x^y, x%y
賦值

=, +=, -=, *=, /=, %=, ^=,++, —
比較

==, !=, >, >=, <, <=
模式匹配符

:左邊是否和右邊匹配包含!:是否不匹配
邏輯

&&,||,!

awk -F: ‘{printf “Username: %-15s,UID:%d\n”,$1,$3}’ /etc/passwd
PROGRAM
pattern

)默認匹配每一行
)/pattern/:僅處理匹配到的行
)/pattern1/,/pattern2/:處理 pattern1 到 pattern2 之間
)關係表達式:真:非0假:空或0

action

)Expressions: 算術,比較表達式等
) Control statements :if, while等
) Compound statements :組合語句
) input statements
) output statements :print等

控制語句

if-else

awk ‘BEGIN{ test=100;if(test>90){print “very good”} else if(test>60){ print “good”}else{print “no pass”}}’

成績爲100;大於90打印“very good”;大於60打印“good”;其餘打印“no pass”
while 循環

條件”真”,進入循環;條件”假”,退出循環

awk ‘/1*linux16/{i=1;while(i<=NF) {if(length($i)>=10){print i,length(i,length(i)}; i++}}’ /etc/grub2.cfg

以空白符開頭後跟”linux16″的行中,把字符數大於10的字符串打印出來。
do-while 循環

無論真假,至少執行一次

awk ‘BEGIN{ sum=0;i=0;do{sum+=i;i++;}while(i<=100);print sum}’

累加
for 循環

遍歷

awk ‘/2*linux16/{for(i=1;i<=NF;i++) {printi,length(i,length(i)}}’ /etc/grub2.cfg
switch 語句
break 和 continue

awk ‘BEGIN{sum=0;for(i=1;i<=100;i++){if(i%2==0)continue;sum+=i}print sum}’

awk ‘BEGIN{sum=0;for(i=1;i<=100;i++){if(i==66)break;sum+=i}print sum}’
next

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

seq {1,20} | awk -F: ‘{if($1%2==0)next ; print $1}’

打印奇數行

數組

)可使用任意字符串;字符串要使用雙引號括起來
)如果某數組元素事先不存在,在引用時,awk 會自動創建此元素,並將其值初始化爲“空字符串(即爲”假”)”

若要判斷數組中是否存在某元素,要使用“index in array”格式進行遍歷
實例:
匹配/bin/bash字段的行,然後將所在行輸出第一列
在這裏插入圖片描述
!arr[$0]++ 設置變量,去除重複行
在這裏插入圖片描述
打印一行中的最後一個字段
在這裏插入圖片描述
輸出指定列
在這裏插入圖片描述
規定格式輸出內容
在這裏插入圖片描述1+…+100=sum
在這裏插入圖片描述
匹配以web開頭的行將除本身外的所有行跟在後邊
加粗樣式**


  1. [:space:] ↩︎

  2. [:space:] ↩︎

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章