awk即gawk,是一款在Linux中實現文本格式化輸出的文本處理工具,在Linux中與文本過濾工具grep和文本行編輯器sed共同組成Linux中的文本處理三劍客。express
awk在處理文本時以行爲單位,讀入整行數據後以指定的分隔符對行進行切片,而後再針對切片後的數據進行處理。以下圖所示:數組
文本通過指定的分隔符進行切片後再對每一片進行處理,而後在根據設定的動做對處理後的文本執行動做,而切片後的文本若是隻想引用一部分也可使用變量進行引用,其引用的各個變量以下表所示:bash
變量服務器 |
指代tcp |
$0、$N編輯器 |
當前處理行的全部內容ide |
$1,$2,$3...函數 |
當前處理行切片後的第1、第2、第三...片內容工具 |
awk使用方式spa
1.awk命令行
#awk
2.awk程序文件
awk -f /PATH/TO/awk_script_file
3.awk腳本
#!/bin/awk -f
awk基本基本語法
awk [OPTIONS] ‘program’ FILE1 FILE2......
Program:PATTERN{ACTION STATEMENT}
Program由語句組成,各語句之間使用;隔開
OPTIONS:
-F:指定分隔符
例:顯示當前系統的各用戶名及其UID
[root@localhost tmp]# awk -F: '{print $1,$3}' /etc/passwd
-v:指定變量
例:使用awk定義一個變量,並顯示其值
[root@localhost tmp]# awk -v file=/etc/passwd BEGIN'{print file}'
/etc/passwd
-f:後接awk腳本文件
例:
awk內置變量:
變量 |
意義 |
變量 |
做用 |
FS |
輸入分隔符 |
OFS |
輸出分隔符 |
RS |
行分隔符 |
NR |
文件的行數(統一計數) |
NF |
當前行的字段數 |
FNR |
文件的行數(單獨計數) |
FILENAME |
當前處理文件的文件名 |
ARGC |
當前命令行參數的個數 |
ARGV |
以數組方式保存命令行參數個數 |
變量的幾個使用實例
例1:使用多種字符做爲輸入分隔符
例2:使用不一樣的輸出分隔符
例3:使用「,」做爲行分隔符
例4:查看當前文件每行的字段數
例5:使用分別計數和統一計數顯示當前處理的文件和正處理的行數,並顯示其文件名
例6:顯示當前命令的參數個數
[root@localhost tmp]# awk 'BEGIN{print ARGC}' 1
ACTION之print、printf
EXPRESSIONS:表達式
Control Statements:控制語句
if (condition){statements} [else {statement}]
例:打印指定文件的行,條件爲其字段數必須大於三
while (condition) {statements}
例:顯示指定文件中單詞長度大於5的字符串
do statement while (condition)
for (expr1;expr2;expr3){statements}
for (var in array){statements}:遍歷數組array中的元素
break
語法:break [n]:表示退出n輪循環
continue
exit [expression]
{statements}
next:執行next會跳過當前動做,進入下一輪
例:找出當前系統上全部UID爲偶數的用戶,並顯示其用戶名和UID
Compound Statements:複合語句
Input statements:輸入語句
Output statements:輸出語句
print:直接打印輸出內容,會自動換行,上面已經有例子
print item1,item2,...
printf:格式化打印輸出指定內容,不會自動換行
printf FORMAT [修飾符]item1,item2,......
FORMAT:
%c:只顯示字符的ASCII碼
%d:,%i:顯示爲十進制整數
%f:顯示浮點數
%g,%G:以科學計數法或浮點數格式顯示數值
%s:顯示字符串
%u:顯示無符號整數
%%:顯示%自己
修飾符:
#[#]
+:顯示數值符號
-:左對齊
格式化輸出的一個實例
例:格式化輸出當前系統的用戶和其ID
[root@localhost tmp]# awk -F":" '{printf "%s\n %s %15-s %s %2-4s %s\n","---------------------------","|",$1,"|",$3,"|"}' /etc/passwd
awk中的操做符
算數操做符:
操做符 |
意義 |
操做符 |
意義 |
x+y |
x加y |
-x |
表示x是個負值 |
x-y |
x減y |
x%y |
x對y取模 |
x*y |
x乘y |
x^y |
x的y次方 |
x/y |
x除y |
例:定義兩個變量,計算兩個變量的和
[root@localhost tmp]# awk -v f1=2 -v f2=3 'BEGIN{print f1+f2}'
字符操做符:
字符鏈接,可直接寫,不使用其餘符號,
賦值操做符:
操做符 |
意義 |
操做符 |
意義 |
= |
直接賦值 |
%= |
取模後賦值 |
+= |
加後賦值 |
^= |
次方後賦值 |
-= |
減後賦值 |
-- |
自減1後賦值 |
*= |
乘後賦值 |
++ |
自加1後賦值 |
/= |
除後賦值 |
例:定義一個變量,而後對變量進行自加後打印出來
[root@localhost tmp]# awk -v test=1 'BEGIN{test++;print test}'
比較操做符:
操做符 |
意義 |
> |
前面變量是否大於後面變量 |
>= |
前面變量是否大於或者等於後面變量 |
< |
前面變量是否小於後面變量 |
<= |
前面變量是否小於或等於後面變量 |
== |
比較先後兩個變量是否等值 |
!= |
比較先後連個變量是否不等 |
例:定義兩個變量並賦值,判斷其是否相等
[root@localhost tmp]# awk -v f1=2 -v f2=3 'BEGIN{print f1==f2}' 1
模式匹配操做符
操做符 |
意義 |
~ |
是否能被右側模式所匹配 |
!~ |
是否不能被右側模式所匹配 |
例:查看當前系統上全部用戶的用戶名有哪些是以r開頭的
[root@localhost tmp]# awk -F: '{print "user:"$1,"T/F:",$1~/^r.*/}' /etc/passwd
邏輯操做符
操做符 |
意義 |
&& |
與運算 |
|| |
或運算 |
! |
非運算 |
例:判斷給定文件中是否包含root字符串或第一和第二個字符串是否爲都爲tom,1爲是,0爲否
[root@localhost tmp]# awk -F" " '{print NR,($1=="root" || $2=="root" ||$1==$2 && $1=="tom") }' awk
條件表達式:
selector?If-ture-expression:if-false-expression
例:判斷當前系統上的各個帳號的類型(系統帳號和普通帳號)
[root@localhost tmp]# awk -F: '$3<500?utype="system user":utype="common user"{print $1,":",utype}' /etc/passwd
函數調用:
function_name(argu1,argu2...)
常見內建函數
land():返回0,1隨機數
length():取字符串長度
sub(r,s,[,t]):基於r所表示的模式來匹配字符串t中的內容,將其第一次被匹配到的內容替換爲s所表示的字符串
gsub(r,s,[,t]):同上,只不過是全局替換
split(r,a[,r]):以r爲分隔符取切割字符串s,並將切割後的結果保存至a所表示的數組中
substr(s,i,n):從s所表示的字符串取子串,取法:從i表示的位置開始,取n個字符
systime():取當前系統的時間戳
用戶自定義函數
Function f_name(p,q){...}
PATTERN:
空模式:匹配文本中的全部行
/Regular Expression/:僅將ACTION應用於Regular Expression所匹配到的行
例:顯示/etc/passwd文件中包含root字符串行的相關信息
[root@localhost tmp]# awk '/root/{print $0}' /etc/passwd root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin
關係表達式:結果爲真時才執行
例:找出/etc/passwd文件中的普通用戶,並打印輸出
[root@localhost tmp]# awk -F: '$3>=500{print $1,$3}' /etc/passwd wuxiaotao 500 wxt 501
行定界:start_line,stop_line
BEGIN:在文件格式化操做以前實現執行的一次操做
例:打印歡迎信息
[root@localhost tmp]# awk 'BEGIN{print "hello welcome!"}'
END:在文件格式化操做完成後,命令退出以前執行的一次操做
例:處理完文件後提示文件已經處理完了
[root@localhost tmp]# awk -F: '$3>=500{print $1,$3}END{print "The End"}' /etc/passwd wuxiaotao 500 wxt 501 The End
數組:
關聯數組:array[index-expression]
Index-expression
可使用任意字符
若是某數組事先不存在,則在引用時,awk會自動建立此元素將其值初始化爲空串
例:統計給定文件中各個單詞的出現次數
[root@localhost tmp]# awk '{for(i=1;i<=NF;i++){count[$i]++}}END{for(j in count){print j,count[j]}}' awk
例:查看當前tcp協議的各類狀態的個數
[root@localhost tmp]# ss -tan | awk '!/state/{state[$1]++}END{for(i in state)print i,state[i]}'
例:統計當前服務器上各個ip訪問的次數
[root@localhost tmp]# awk '{ip[$1]++}END{for(i in ip)print i,ip[i]}' /var/log/httpd/access_log
差很少就這樣吧,內容太多了,不少格式也不統一,有些都是上課跟着老師作的筆記。慚愧!