您好,登錄后才能下訂單哦!
一、awk簡介:
awk 是一種編程語言,用于在 linux/unix 下對文本和數據進行處理。數據可以來自標準輸入、一個或多個文件,或其它命令的輸出。它支持用戶自定義函數和動態正則表達式等先進功能,是linux/unix下的一個強大編程工具。它在命令行中使用,但更多是作為腳本來使用。
awk 的處理文本和數據的方式是這樣的,它逐行掃描文件,從第一行到最后一行,尋找匹配的特定模式的行,并在這些行上進行你想要的操作。如果沒有指定處理動作,則把匹配的行顯示到標準輸出(屏幕),如果沒有指定模式,則所有的操作的所指定的行都被處理。
二、awk的兩種形式語法格式
awk?[options]?'commands'?filenames???//過濾并輸出文件符合條件的內容 awk?[options]?-f?awk-script-file?filenam??????//從腳本中調用編輯指令,過濾并輸出內容
options:
-F??定義輸入字段分隔符,。默認的分隔符是空格或制表符(tab)
commands
BEGIN{}?{}?END{} 行處理前?行處理?行處理后 BEGIN{}?通常用于定義一些變量,例如?BEGIN{FS=":";OFS="---"}
使用BEGIN語句設置計數和打印頭。BEGIN語句使用在任何文本瀏覽動作之前,之后文本瀏覽動作依據輸入文本開始執行,END語句用來在awk完成文本瀏覽動作后打印輸出文本總數和結尾狀態。
awk命令格式
awk?'pattern'?filename??????????示例:awk?-F:?'/root/'?/etc/passwd? awk?'{action}'?filename?????????示例:awk?-F:?'{print?$1}'?/etc/passwd? awk?'pattern?{action}'?filename?示例:awk?-F:?'/root/{print?$1,$3}'?/etc/passwd? ????????????????????????????????示例:awk?'BEGIN{FS=":"}?/root/{print?$1,$3}'?/etc/passwd command?|awk?'pattern?{action}'?示例:df?-P|?grep?'/'?|awk?'$4?>?25000?{print?$4}'
三、awk工作原理
#?awk?-F:?'{print?$1,$3}'?/etc/passwd
(1)awk 使用一行作為輸入,并將這一行賦給內部變量$0,每一行也可稱為一個記錄,以換行符結束
(2)然后,行被:(默認為空格或制表符)分解成字段(或域),每個字段存儲在已編號的變量中,從$1 開始,最多達 100 個字段
(3)awk 如何知道用空格來分隔字段的呢? 因為有一個內部變量 FS 來確定字段分隔符。初始時,FS 賦為空格
(4)awk 打印字段時,將以設置的方法使用 print 函數打印,awk 在打印的字段間加上空格,因為$1,$3 之間有一個逗號。逗號比較特殊,它映射為另一個內部變量,稱為輸出字段分隔符 OFS,OFS 默認為空格
(5)awk 輸出之后,將從文件中獲取另一行,并將其存儲在$0 中,覆蓋原來的內容,然后將新的字符串分隔成字段并進行處理。該過程將持續到所有行處理完畢
四、awk內建變量
FS:指定每行文本的字段分隔符,默認為空格或制表位。(-F) NF:當前處理的行的字段個數。 NR:當前處理的行的行號(序數)。 $0:當前處理的行的整行內容。 $n:當前處理行的第?n?個字段(第?n?列)。 FILENAME:被處理的文件名。RS:數據記錄分隔,默認為\n,即每行為一條記錄。
五、格式化輸出
print函數
#?date?|awk?'{print?"Month:?"?$2?"\nYear:?"?$NF}' #?awk?-F:?'{print?"username?is:?"?$1?"\t?uid?is:?"?$3}'?/etc/passwd #?awk?-F:?'{print?"\tusername?and?uid:?"?$1,$3?"!"}'?/etc/passwd
printf 函數
#?awk?-F:?'{printf?"%-15s?%-10s?%-15s\n",?$1,$2,$3}'?/etc/passwd #?awk?-F:?'{printf?"|%-15s|?%-10s|?%-15s|\n",?$1,$2,$3}'?/etc/passwd
%s 字符類型
%d 數值類型
占 15 字符
- 表示左對齊,默認是右對齊
printf 默認不會在行尾自動換行,加\n
===========================
六、awk模式
1、正則表達式:
匹配記錄(整行):
#?awk?'/^alice/'?/etc/passwd #?awk?'$0?~?/^alice/'?/etc/passwd #?awk?'!/alice/'?passwd #?awk?'$0?!~?/^alice/'?/etc/passwd
匹配字段:匹配操作符(~? ? ?!~)
#?awk?-F:?'$1?~?/^alice/'?/etc/passwd #?awk?-F:?'$NF?!~?/bash$/'?/etc/passwd
2、比較表達式:
比較表達式采用對文本進行比較,只有當條件為真,才執行指定的動作。比較表達式使用關系運算符,
用于比較數字與字符串。
關系運算符
運算符 含義 示例
<?小于?x<y <=?小于或等于?x<=y ==?等于?x==y !=?不等于?x!=y >=?大于等于?x>=y >?大于?x>y
#?awk?-F:?'$3?==?0'?/etc/passwd #?awk?-F:?'$3?<?10'?/etc/passwd #?awk?-F:?'$7?==?"/bin/bash"'?/etc/passwd #?awk?-F:?'$1?==?"alice"'?/etc/passwd #?awk?-F:?'$1?~?/alice/?'?/etc/passwd #?awk?-F:?'$1?!~?/alice/?'?/etc/passwd #?df?-P?|?grep?'/'?|awk?'$4?>?25000'
3、條件表達式:
#?awk?-F:?'$3>300?{print?$0}'?/etc/passwd #?awk?-F:?'{?if($3>300)?print?$0?}'?/etc/passwd #?awk?-F:?'{?if($3>300)?{print?$0}?}'?/etc/passwd #?awk?-F:?'{?if($3>300)?{print?$3}?else{print?$1}?}'?/etc/passwd
4、算術運算:+ - * / %(模) ^(冪 2^3)
可以在模式中執行計算,awk 都將按浮點數方式執行算術運算
#?awk?-F:?'$3?*?10?>?500'?/etc/passwd #?awk?-F:?'{?if($3*10>500){print?$0}?}'?/etc/passwd
5、邏輯操作符和復合模式
&&?邏輯與?a&&b ||?邏輯或?a||b !?邏輯非?!a
#?awk?-F:?'$1~/root/?&&?$3<=15'?/etc/passwd #?awk?-F:?'$1~/root/?||?$3<=15'?/etc/passwd #?awk?-F:?'!($1~/root/?||?$3<=15)'?/etc/passwd
6、范圍模式
#?awk?'/Tom/,/Suzanne/'?filename
示例
1、統計系統給用戶數
2、統計用戶名為4個字符的用戶
3、自定義變量。查詢root用戶
4、獲得網卡IP(出ipv6以外的所有IP)
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。