文本處理三工具:grep粒督,sed,awk
- grep:文本過濾工具:pattern灭忠;
- sed:行編輯器:模式空間膳算、保持空間;
- awk:報告生成器:格式化文本輸出更舞;
awk命令
awk的運行方式
- (1)awk 命令行
- (2)awk 程序文件
- (3)awk 腳本
命令格式
awk [options] 'program' FILE ....
其中畦幢,program:PATTERN{ACTION STATEMENT}
PATTERN:模式
ACTION STATEMENT:動作語句,可以是由多個語句組成缆蝉,各語句間使用分號分隔宇葱;
常用選項
-F:指明輸入時用到的字段分隔符;
-v var=value:自定義變量刊头;
awk工作過程
- 一次性讀取一行文本黍瞧,然后根據(jù)輸入分隔符(默認為空格字符)對文本進行切片;
- 將文本切成n個片段原杂,然后將每一片都賦予awk內(nèi)部的一個變量進行保存印颤,這些變量名為$1、$2穿肄、$3......$n年局;
- awk可以對上述片段進行單獨處理,比如:顯示某一段咸产、特定段矢否、甚至可以對某些片段進行額外的加工處理,比如計數(shù)脑溢、運算等僵朗。
1.awk的輸出命令之一:print
用法:
print item1,item2,....
item:字符串,用引號引用屑彻;
print "hello","world"
變量:顯示變量的值验庙,可以直接使用變量的名進行引用,不需要加$;
print name
數(shù)值:無需加引號
要點:
- (1)逗號分隔符社牲;
- (2)輸出的各item可以是字符串粪薛,也可以是數(shù)值;當前記錄的字段搏恤、變量或awk的表達式汗菜;
- (3)如果省略item,相當于print $0挑社;打印整行字符
實例
[root@localhost ~]# last -n 5
mageia pts/1 192.168.0.8 Wed May 23 05:02 - 05:02 (00:00)
root pts/0 192.168.0.8 Thu May 17 23:23 still logged in
logstash pts/1 192.168.0.8 Wed May 16 00:12 - 16:56 (16:43)
root pts/0 192.168.0.8 Sat May 12 23:27 - 23:22 (4+23:55)
root tty1 Sat May 12 23:23 still logged in
[root@localhost ~]# last -n 5 | awk '{print $1 "\t" $3}'
mageia 192.168.0.8
root 192.168.0.8
logstash 192.168.0.8
root 192.168.0.8
root Sat
2.變量
2.1 內(nèi)置變量
NF:每一行($0)擁有的字段總數(shù)
- print NF:顯示當前行的字段數(shù);
- print $NF:顯示當前行的第NF字段的值巡揍;
NR:目前awk所處理的是“第幾行”數(shù)據(jù)痛阻;
FS:目前的分隔字符,默認為空白字符腮敌;
實例
- 列出每一行的賬號(即$1)
- 列出每一行的賬號(即awk內(nèi)的NR變量)
- 并且說明阱当,改行有多少字段(即awk內(nèi)的NF變量)
[root@localhost ~]# last -n 5 | awk '{print $1 "\t lines:" NR "\t columes:" NF}'
mageia lines:1 columes:10
root lines:2 columes:10
logstash lines:3 columes:10
root lines:4 columes:10
root lines:5 columes:9
2.2 自定義變量
- -v var=value 變量名區(qū)分字符大小寫俏扩;在program中直接定義
實例
//使用文件/etc/issue的行數(shù),有多少行就顯示多少行Linux
[root@localhost ~]# awk -v Final='linux' '{print Final}' /etc/issue
linux
linux
linux
3.awk的邏輯運算符
>弊添,>=录淡,<,<=油坝,嫉戚!=,==
- 模式匹配符:
~:是否匹配
!~:是否不匹配
- 邏輯操作符:
&& 澈圈,||彬檀,!
- 函數(shù)調(diào)用:
function_name(argu1瞬女,argu2窍帝,...)
- 條件表達式:
selector?if-true-expression:if-false-expression
4.PATTERN模式
- (1)empty:空模式诽偷,匹配每一行坤学;
- (2)/regular expression/:僅處理能夠被此處的模式匹配到的行;
- (3)relational expression:關(guān)系表達式报慕;結(jié)果有“真”有“假”深浮;結(jié)果為“真”才會被處理;
- (4)line ranges:行范圍卖子,不支持直接給出數(shù)字的格式略号;
- (5)BEGIN/END模式
BEGIN{}:僅在開始處理文件中的文本之前執(zhí)行一次;
END{}:僅在文本處理完成之后執(zhí)行一次洋闽;
實例
//awk處理/^[ab]/ 模式匹配的行玄柠,即a或b開頭的行
[root@localhost ~]# awk -F: '/^[ab]/ {print $1,$3}' /etc/passwd
bin 1
adm 3
abrt 173
avahi 70
bash 501
basher 502
//結(jié)果為真才處理,結(jié)果為假不處理
[root@localhost ~]# awk -F:'$3>=500{print $1,$3}' /etc/passwd
^C
[root@localhost ~]# awk -F:'$1~/root/{print $1,$3}' /etc/passwd
^C
//
[root@localhost ~]# cat /etc/passwd | awk -F: '$3<10 {print $1 "\t" $3}'
root 0
bin 1
daemon 2
adm 3
lp 4
sync 5
shutdown 6
halt 7
mail 8
[root@localhost ~]# awk -F: '$3<10 {print $1 "\t" $3}' /etc/passwd
root 0
bin 1
daemon 2
adm 3
lp 4
sync 5
shutdown 6
halt 7
mail 8
//awk處理2~10行
[root@localhost ~]# awk -F: '(NR>=2&&NR<=10) {print $1}' /etc/passwd
bin
daemon
adm
lp
sync
shutdown
halt
mail
uucp
5.常用的action
- (1)Expressions
- (2)Control statements:if诫舅,while等:
- (3)Compound statements:組合語句羽利;
- (4)input statements
- (5)output statements
5.1.if-else
- 語法:if(condtions) statement [else statement]
- 使用場景:對awk取得的整行或某個字段進行條件判斷;
實例
[root@localhost ~]# cat /etc/fstab
#
# /etc/fstab
# Created by anaconda on Sun Jul 2 04:16:54 2017
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
......
[root@localhost ~]# awk '{if($NF>5) printf $0} ' /etc/fstab
# Created by anaconda on Sun Jul 2 04:16:54 2017# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
5.2 while循環(huán)
- 語法:while(condition) statement
條件“真”刊懈,進入循環(huán)这弧;條件“假”,退出循環(huán)虚汛; - 使用場景:對一行內(nèi)的多個字段逐一類似處理時使用匾浪;對數(shù)組中的各元素逐一處理時使用;
實例
[root@localhost ~]# cat /etc/issue
CentOS release 6.3 (Final)
Kernel \r on an \m
[root@localhost ~]# awk '{i=1;while(i<=NF){if(length($i)>=6) {print $i};i++}}' /etc/issue
CentOS
release
(Final)
Kernel
5.3 for循環(huán)
- 語法:for(exper1;expr2;expr3) statement
- for(variable assignment;condition;iteration process) {for-body}
實例
[root@localhost ~]# awk '{for(i=1;i<=NF;i++){if(length($i)>=6)print $i}}' /etc/issue
CentOS
release
(Final)
Kernel
- 特殊用法:能夠遍歷數(shù)組中的元素卷哩;
語法:for(var in array) (for-body)
6.awk的輸出命令之二:printf格式化輸出
格式化輸出:
printf FORMAT,item1,item2,...
- (1)FORMAT必須給出蛋辈;
- (2)不會自動換行,需要顯式給出換行控制符,\n
- (3)FORMAT中需要分別為后面的每個item指定一個格式化符號冷溶;
格式符:
- 都以%開頭渐白,后跟單個字符
%c:顯示字符的ASCII碼;
%d逞频,%i:顯示十進制整數(shù)纯衍;
%e漫拭,%E:科學計數(shù)法數(shù)值顯示袍镀;
%f:顯示浮點數(shù)奠旺;
%g簇宽,%G:以科學計數(shù)法或浮點形式顯示數(shù)值菲嘴;
%s:顯示字符串调鬓;
%u:無符號整數(shù)翩隧;
%%:顯示%自身窝革;
修飾符:
#[.#]:第一個數(shù)字用來控制顯示的寬度堡掏;第二個#表示小數(shù)點后的精度应结; %3.1f
-:左對齊
+:顯示數(shù)值的符號