正則表達三劍客:
grep:文
本過濾器
sed:行編輯器
awk: 報告生成器
GNU AWK :gawk
awk使用的基本語法
awk [options]’program’file file...
awk[options]’’
awk工作原理 切片整行 輸入空白符號 默認空格 賦值給內建變量$1 $2...整行$0
$nf number file
遍歷。。。爲什麼還要循環呢 每一行都有很多字段 如果對每一行的字段 按條件 就需要循環了
awk的輸出
print item1,item2
①各項目之間使用逗號分隔,而輸出時則使用輸出分隔符分隔
②輸出的各item可以是字符串或者數值。當前記錄的字段 變量或者awk表達式。數值會被隱式轉換爲字符串後輸出
③print後面的item如果省略,相當於print $0 ,輸出空白,使用print””
#awk -F: '{print $1}' /etc/passwd
#awk -F: '{print "hello",$1}' /etc/passwd
2.awk的變量
內置變量
自定義變量
2.1內置變量
FS:Field Seperator ,輸入時的字段分隔符
#awk 'BEGIN{FS=":"}{print $1,$7}' /etc/passwd
RS:Record Seperator ,輸出行分隔符
OFS :Output filed Seperator 輸出時的字段分隔符
#awk 'BEGIN{FS=":";OFS=":"}{print $1,$7}' /etc/passwd
ORS:Output Row Seperator 輸出時的行分隔符
#awk 'BEGIN{FS=":";ORS=":"}{print $1,$7}' /etc/passwd
NF:numbers of field 字段數
NR:numbers of Record 行數 所有文件的一併計數
FNR:行數 各文件分別計數
#awk 'BEGIN{FS=":";OFS=":"}{print FNR,$1,$7}' /etc/passwd
Awk中引用變量引用無需加$符號
ARGV 數組 保存命令本身這個字符,awk'{print $0}'1.txt 2.txt 意味着ARGV[0]保存awk
ARGC 保存awk命令中參數的個數的
awk‘BEGIN{print ARGV[0],ARGV[1]}' /etc/passwd /etc/group
awk 'BEGIN{print ARGV[0],ARGV[1],ARGC}' /etc/passwd /etc/group
FILENAME:awk正在處理的當前文件的名稱
2.2可自定義變量
-v var_name=VALUE
變量名區分字符大小寫;
#awk 'BEGIN{a="hello awk"}{print a]' /etc/passwd
#awk 'BEGIN{a="hello awk";print a}'
#awk -v a="hello gawk" 'BEGIN{print a}
'
①可以在program中定義變量
②可以在命令行中定義變量:awk中-v的選項
3.awk的printf(打印格式)
命令使用格式:printf format,item1,item2...
要點:
(1)要指定format
(2)不會自動換行,如需換行則需要給出\n
(3)Format用於爲後面的每個item指定其輸出格式
Format格式的指示符都%開頭,後跟一個字符
%c顯示字符的ASCII碼
%d ,%i 十進制整數
%e,%E 科學計數法顯示數值
%f 顯示浮點數
%g,%G以科學計數法格式或者浮點數格式顯示
%s 顯示字符串
%u 顯示無符號整數
%% 顯示%自身
修飾符:
# 顯示寬度
- 左對齊
+ 顯示數值的符號
.# 取值精度
#awk -F:'{printf "%20s,%30s\n",$1,$7}' /etc/passwd
#awk -F:'{printf "%15s,%-20s\n",$1,$7}' /etc/passwd
浮點數格式
#awk 'BEGIN{printf "%f\n",3.1415}'
浮點數格式#awk 'BEGIN{printf "%f\n",3.1415926}'
4 awk輸出重定向
Print items > output-file
Print items >> output-file
Print items | command
特殊文件描述符
/dev/stdin:標準輸入
/dev/stdout:標準輸出
/dev/stderr:錯誤輸出
5.awk的操作符
算術操作符:
x+y
x-y
x*y
x/y
x**y,x^y
x%y
-x 負值
+x 轉換爲數值
賦值操作符
=
+=
-=
*=
/=
%=
^=
**=
++
--
如果模式自身爲=號 要寫爲/=/
比較操作符
<
<=
>
>=
==
!=
~ 模式匹配 左邊的字符串能夠被右邊的模式所匹配 匹配爲真 否則爲假
!~
subscript in array
邏輯操作符
&&與
|| 或
條件表達式
selector?If-true-expression:if-false-expression 表達式
函數調用:
function_name(argu1,argu2)
6.模式
①正則表達式Regexp:格式爲/PATTERN/
僅處理被/PATTERN匹配到的行
②Expression :表達式,其結果爲非0或者非空字符串時滿足條件
僅處理滿足條件的行
③Ranges:行範圍,此前地址定界,startline,endline
僅處理範圍內的行
④BEGIN/END;特殊模式,僅在awk命令的program運行之前(BEGIN)或運行之後(END)執行一次
⑤Empty:空模式,匹配任意行
7.awk 常用的action
①Expression表達式
②Control statements 控制語句
③Compound statements 組合語句
④Input statements 輸入語句
⑤Output statements 輸出語句
8控制語句
①if-else語句
格式:if(condition){then body}else{else body}
如果id號大於500 爲普通用戶 否則爲系統用戶
#awk -F: ’{if ($3>=500) {print $1}}’
②while
格式:while (condition){while body}
例:顯示inittab第奇數字段
length()函數 取字符串的長度 內置函數
字符個數大於等於6的
③do-while 循環
格式:do{do-while body}while(condition) 至少循環一次循環體
顯示奇數的字段
④for循環
格式:for (variable assignment;condition;iteration process){for body}
字段大於等於6的
for循環可用來遍歷數組元素
語法:for (i in array){for body}遍歷元素的縮影
⑤case語句
語法:switch(Expression){case VALUE or RGEEXP/: statement1;...default: stementN}
⑥循環控制
break
continue
⑦next
提前結束對本行的處理而進入下一行進行處理
顯示passwd下奇數行的用戶名
如果某一行id爲偶的顯示
9.數組
array[index-expression]
Index-expression:可以使用任意字符串 如果某數組元素事先不存在,那麼在引用時,awk會自動創建此元素並將其初始化爲空字串。因此,要判斷某數組是否存在某元素,必須使用“index in array”這種格式。
例A[FIRST]=’hello awk’’
print A[second]
要遍歷數組中的每一個元素,需要使用如下特殊結構
For (var in array) {for body}
其var會遍歷array的索引
state[LISTEN]++
state[ESRABLISHED]++
刪除數組元素
delete array [index]
10.awk的內置函數
split(string,array[,fieldsep[,seps]]):
功能 :將sring表示的字符串以fieldsep爲分隔符進行切片,並切片後的結果保存至
顯示每個ip地址的次數