16.3、awk使用介紹
文本過濾工具:grep、egrep、fgrep
行編輯工具:sed
格式化文本工具:awk、gawk
註意:centos7中,awk是指向gwak的鏈接文件。
[root@localhost ~]# ll -l `which awk`
lrwxrwxrwx. 1 root root 4 Aug 29 20:01 /usr/bin/awk -> gawk
[root@localhost ~]#
2、awk工作原理:
awk從文本中一次讀取一行,按指定的分隔符切割成若幹個片段部分,默認的分隔符是“空白”字符,每個分片都保存在awk內建的變量中($1,$2,$3...),然後用動作(常用的print、printf命令)去輸出這些行中的某一個分片、某幾個或者整行分片。整行內容用"$0"表示,切割出來的每一分片,也可以進行加工處理。
3、awk命令:
格式:gawk [OPTIONS] 'program' FILE ... //註意program要用單引號引起來
3.1、awk的OPTIONS: -F:指定輸入時的字段分割符,用於文件中讀取時以什麽為分割符;默認為空格分割符 -v var=value :自定義變量 |
3.2、awk的program的格式:
PATTERN{ACTION STATEMENT} //此處的PATTERN作用主要是界定需要編輯的行,action執行的動作,statement要執行的語句,可以有多個,語句之間以分號(;)分隔。
示例:
[root@localhost ~]# tail -3 /etc/fstab | awk '{print $2,$4}' //輸出時默認以空白字符分隔片段;cut只能理解單個或固定的空白字符。
常用的action:
①、expression:運算表達式
②、control statement:控制語句,如if、while語句等
③、compound statement:組合語句
④、input statement:輸入語句
⑤、outprint statement:輸出語句,如print,printf
⑤.1、輸出語句--print:
語法格式:print item1,item2,...
解釋:多個字段(item)以逗號分隔,否則輸出時是合並在一起輸出的;
輸出的各item字段可以是字符、數值、當前記錄的字段變量或awk的表達式;
如果省略item,則輸出整行內容,相當於打印"$0"
print示例:
[root@localhost ~]# tail -3 /etc/fstab | awk '{print "hello:" $1,$2}'
hello:UUID=43446f03-00c0-4d49-a4f3-2050cecfff9e /boot
hello:/dev/mapper/cl-swap swap
[root@localhost ~]# tail -3 /etc/fstab | awk '{print "hello: $1,$2"}' //print後放在雙引號中的內容不會被替換成其他數值。
hello:/dev/mapper/cl-root /
hello: $1,$2
hello: $1,$2
hello: $1,$2
[root@localhost ~]#
⑤.2、輸出語句--printf:格式化輸出
語法格式:printf FORMAT,item1,item2,... //format為格式符,它會為每個item占一個位置,item的數值會套用format中定義的格式。
語法要點:
FORMAT必須給出
printf不會自動換行,如要換行,需要顯式給出換行控制符"\n"
FORMAT中需要分別為後面的每個item指定一個格式化符號
FORMAT格式符介紹:
%c:顯式字符的ASCII碼
%d或%i:顯式為十進制的整數
%e或%E:科學計數法數值顯式
%f:顯式為浮點數
%g或%G:以科學計數法或浮點形式顯示數值
%s:顯示為字符串
%u:顯示為無符號整數
%%:顯示%自身
printf示例:
3.3、awk的變量介紹:
內建變量: FS:input filed Seperate,輸入片段分隔符,默認為空白字符 OFS:output filed seperate,輸出片段分隔符,默認為空白字符 示例:[root@localhost ~]# awk -v FS=':' '{print $1,$2}' /etc/passwd //指定輸入分隔符為: ,然後打印出每行的第一個和第二個分片部分 [root@localhost ~]# awk -F: '{print $1}' /etc/passwd //直接用—F選項指定分隔符: [root@localhost ~]# awk -v FS=':' -v OFS=':' '{print $1,$2}' /etc/passwd //指定輸入分隔符和輸出分隔符,每個-v選項定義一個變量 RS:input record Seperate:指定輸入時的換行符,很少用到 ORS:outpunt reccord seperate:指定輸出時的換行符,很少用到 示例:[root@localhost ~]# head -1 /etc/passwd | awk -v RS=':' '{print $0}' //指定輸入時的換行符為: [root@localhost ~]# head -1 /etc/passwd | awk -v RS=':' -v ORS='#' '{print $0}' //指定輸入時的換行符為:,輸出換行符# NF:number of filed,統計每一行分片後的分片個數 示例:[root@localhost ~]# head -1 /etc/passwd | awk -v FS=':' '{print NF}' //統計以':'分隔後分片字段個數,結果為7,註意此處的NF不要加$符號 [root@localhost ~]# head -1 /etc/passwd | awk -v FS=':' '{print $NF}' //如果NF前加上$符號,表示引用每行的最後一個分片字段,相當於$7; 註意:awk中引用變量時不要加$符號,但是引用分片字段時要加$符號。 NR:number of reord:統計行數(會顯示每一行的行號,如果有多個文件會統一編號) 示例:[root@localhost ~]# awk '{print NR,$1}' /etc/fstab //統計文件有多少行 [root@localhost ~]# awk '{print NR,$1}' /etc/fstab /etc/issue //有多個文件時會統一編號 FNR:number of reord:統計行數(會顯示每一行的行號,如果有多個文件不會統一編號) 示例:[root@localhost ~]# awk '{print FNR,$1}' /etc/fstab /etc/issue //有多個文件時不會統一編號 FILENAME:顯示被處理的文件名稱,即被awk處理的文件的名稱 示例:[root@localhost ~]# awk '{print FILENAME}' /etc/issue //會每行顯示一個文件名 ARGC:bash命令行參數的個數 ARGV:數組,保存的是bash命令行所給定的各參數 示例:[root@localhost ~]# awk 'BEGIN{print ARGC}' /etc/issue //ARGC統計命令行給的參數個數 2 [root@localhost ~]# awk 'BEGIN{print ARGV[0]}' /etc/issue //引用bash命令行保存的數組參數 awk [root@localhost ~]# awk 'BEGIN{print ARGV[1]}' /etc/issue /etc/issue [root@localhost ~]# awk 'BEGIN{print ARGV[2]}' /etc/issue |
自定義變量:
方法一:-v var=value //var為變量名,value是變量值;需要註意的是:awk中的變量名區分大小寫
示例:
[root@localhost ~]# awk -v test='hello magedu' '{print test}' /etc/issue //print後此處引用變量不要加$符號
hello magedu
hello magedu
hello magedu
方法二:在program中直接定義:
示例:
[root@localhost ~]# awk '{test="hello magedu";print test}' /etc/issue //多個語句間用分號分隔。
hello magedu
hello magedu
hello magedu
[root@localhost ~]#
16.3、awk使用介紹