### awk
awk分為nawk,gawk
我們shell中常用的awk 其版本是gawk
“`
AWK會把file中的每一行(記錄/可以指定分隔符),讀入空間中并默認以空白(TAB\space\\n)等分割成幾個字段,每個字段用$#表示$0表示整行本身
“`
awk [Option] ‘program’ file
option
-F:制定輸入時的字段分隔符
-v:var=VAR:自定義變量
program:Pattern{Action}
pattern:相當于地址定界
action:
一、print:輸出到終端(相當于s1hell中的echo)
print item1,item2
1)以逗號為分隔符
2)輸出的各item可以是字符串或數值:當前記錄的字段、變量或awk的表達式
(字符串要以雙引號引起來,如果$#被引起來那么輸出則是$#而不是$#轉換出來的變量值)
3)如果省略item,相當于print $0
示例:基本工作方式
“`
awk ‘{print $2″:”$4}’ /etc/fstab
/etc/fstab:
/data:defaults
/apache:defaults
/md1:defaults
/dev/shm:defaults
/dev/pts:gid=5,mode=620
/sys:defaults
/proc:defaults
[root@zhangxiao ~]#
“`
變量:變量需和-v一起使用
內建變量:
FS:默認輸入分隔符(列)
OFS:默認輸出分隔符(列)
RS:默認輸入分隔符(行)
ORS:默認輸出分隔符(行)
NF:字段數量
NR:行數量(也叫記錄數量)(從1..往后編)
FILENAME:當前處理的文件名(每一行顯示)
ARGC:命令行參數的個數
ARGV:數組,保存的是命令行所給定的各參數
awk -v FS=: ‘{print $1}’ file
查找全文,每行按:為分隔符的列輸出$1到屏幕
自定義變量
1)-v VAR=VARLUE
變量名字區分大小寫
2)在program中直接定義
在{中引用變量(除了位置變量)不需要寫$符}
[root@zhangxiao ~]#awk -v A=”hello” ‘BEGIN{print A}’
hello
[root@zhangxiao ~]#
printf命令
printf FORMAT,item1,item2…
1)format必須給出
2)不會自動換行,如果需要顯示必須給出換行符\n
3)format中需要分別為后面的每一個item制定一個格式化符號
格式符
%c:顯示字符的ASCII碼
%d,%i:顯示十進制整數
%e.%E:科學計數法數值顯示
%f:顯示浮點數
%g,%G:以科學計數法或者浮點數形式顯示數值
%f:顯示字符串
%u:無符號整數
%%:顯示%自身
修飾符
#[.#]:第一個數字控制顯示的寬度;第二個#表示小數點后的精度(不是小數可省略)
(默認為右對齊)
-:表示左對齊
+:顯示數值符號
操作符
算數運算操作符
+
–
*
/
^
%
-x(負號)
賦值
=
+=
-=
*=
/=
++
—
比較
>
<
=
!=
>=
<=
模式匹配符
~ :是否匹配
!~:是否不匹配
匹配后面的pattern要加在//中間
例 :awk ‘$3~/bash$/{print $3}
邏輯操作符
&&
||
!
函數調用
founction_name(argu1,argu2….)
條件表達式:
selector?if-ture-expression:if-false-expression:三目表達式 如果真執行前面的表達式如果失敗執行后面的表達式
PATTERN:
類似于地址定界
1):省略表示匹配每一行
2)/正則表達式/:僅處理能被此處的模式能匹配到的行
3)!//:對不匹配正則表達式匹配的行處理
4)關系型表達式:結果有真假(布爾值 ),結果為真的才處理
(結果非0或者非空時表示真。0和空字符串都表示假
6)//,//第一次匹配pattern1到第一次匹配pattern2
(此處不支持#,#的寫法如果要用需要用判斷如 wak -F: ‘(NR>=2&&NR<=10){print $1}
7)BEGIN/END模式:如果需要在文件處理之前或者之后執行一次的命令用這兩個模式BEGIN{CMD}
常用的action
1)EXPRESSIONS:表達式
2)控制語句 :if while等
3)組合語句 :
4)輸入語句
5)輸出語句
控制語句:if(condition){statments}
if(condition){statments} else {statments2}
while (condition){statments}
do {statments} while (condition)
for(expr1;expr2;expr3){statments}
break,continue
delete array[下標]
delete array
exit
{statments}
詳解控制語句
1) if(condition) statment {else statment}
示例:awk -v FS=: ‘{if($3>500) {print $3} else{print $1 ” is a user”}}’ /etc/passwd
使用場景,對awk取得的整行做條件判斷
2)while(condition) statment
條件為真時進入循環,為假是跳出循環
使用場景:對一行內的多個字段進行注意處理時用,或對數組中的數據進行注意處理時需要用
length():內建函數,統計字符個數
示例
awk -F: ‘/root/{i=1;while(i<=NF){print $i,length($i);i++}}’ /etc/passwd
統計帶有root的行每個單詞以及單詞的字符數
3)do-while循環
do statment while(condition)
至少執行一次循環體
4)for循環
for(expr1;expr2;expr3)statment
for(變量初始值;條件判斷;變量修正) 循環體
示例
awk -F: ‘/root/{for(i=1;i<=NF;i++){if(length($i)>7){print $i,length($i)}}}’ /etc/passwd
for循環可以遍歷數組中的每一個元素
語法
for (VAR in 數組名) 循環體
5)switch語句:
switch(expression){case VAR1 or /REGEXP/:statment;case VAR2 or /REGEXP/:statment2….default:statment}
6) continue和break
同shell
break [n]
continue
7) next :提前結束對本行的處理,直接進入下一行
8)數組
數組名[索引表達式]
索引表達式:
1)可以使用任意字符串
2)如果某數組元素事先不存在,在引用時,awk會自動創建此元素,并將其值初始化為“空串”
要判斷數組中是否存在此元素,使用index in array 格式 進行
如果我們想要顯示數組的元素值,直接調用不需要加$。
函數
內置函數
rand() :取隨機0-1之間小數(一次)
length(【s】):顯示字符串的長度
sub(r,s,[t]):用R表示的模式來查找t所表示的字符中匹配的內容,并將其第一次出現替換為s所表示的內容
gsub(r,s,[t]):全部替換
split(s,a,[r]):以r為分隔符 ,并將切割后的結果保存至a所表示的數組中
本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/99027