網(wǎng)站建設(shè)基礎(chǔ)教程人教版seo培訓(xùn)網(wǎng)
1、概述
Linux三劍客:grep、sed、awk。grep主打查找功能,sed主要是編輯行,awk主要是分割列處理。本篇文章我們詳細(xì)介紹awk命令。
awk其名稱得自于它的創(chuàng)始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首個字母。awk是一種編程語言,用于在linux/unix下對文本和數(shù)據(jù)進(jìn)行處理。數(shù)據(jù)可以來自標(biāo)準(zhǔn)輸入(stdin)、一個或多個文件,或其它命令的輸出。它支持用戶自定義函數(shù)和動態(tài)正則表達(dá)式等先進(jìn)功能,是linux/unix下的一個強(qiáng)大編程工具。它在命令行中使用,但更多是作為腳本來使用。awk有很多內(nèi)建的功能,比如數(shù)組、函數(shù)等,這是它和C語言的相同之處,靈活性是awk最大的優(yōu)勢。
awk是以文件的一行為處理單位的。awk每接收文件的一行,然后執(zhí)行相應(yīng)的命令,來處理文本。
2、語法
awk [選項(xiàng)] '執(zhí)行腳本' var=value 文件列表多個以空格分隔
awk [選項(xiàng)] -f 腳本文件 var=value 文件列表多個以空格分隔
基本使用
[root@liuchao ~]# echo seg1:seg2:seg3:seg4:seg5 | awk -F':' '{print $2$3}'
seg2seg3
[root@liuchao ~]#
圖解:
多分隔符實(shí)例:
從”ab,cd:ef“字符串中拆分出 ”ab ef“ ,這里以”,“和":"為分隔符拆分
[root@liuchao ~]# echo ab,cd:ef | awk -F'[,:]+' '{print $1" "$3}'
ab ef
[root@liuchao ~]#
3、BEGIN 和 END 模塊
咱們知道一個文件有多行數(shù)據(jù),執(zhí)行一個awk命令時,awk會對沒一樣數(shù)據(jù)執(zhí)行相同的命令。但是有時候希望執(zhí)行像模板模式一樣,在整個文件執(zhí)行awk命令之前和之后做一些事情。對于這種需求,我們就需要用到BEGIN和END模塊。
awk在執(zhí)行輸入文件執(zhí)前會執(zhí)行BEGIN塊,在執(zhí)行完輸入文件所有行之后會執(zhí)行END塊。
BEGIN常用場景:初始化字段分隔符變量、打印頁眉等。
END常用場景:執(zhí)行最終計(jì)算或者打印最終摘要信息等。
實(shí)例一、統(tǒng)計(jì)某個文件夾下的文件占用的字節(jié)數(shù)
[root@liuchao ~]# ll
總用量 4
drwxr-xr-x 2 root root 23 3月 31 18:04 awk_test
-rw-r--r-- 1 root root 84 11月 7 2019 catalina.out
drwxr-xr-x 6 root root 64 3月 29 16:38 logs
drwxr-xr-x 4 root root 34 12月 16 2019 nacos
[root@liuchao ~]#
[root@liuchao ~]# ll | awk 'BEGIN {size=0;} {size=size+$5;} END{print "當(dāng)前文件夾總大小是:"size}'
當(dāng)前文件夾總大小是:205
[root@liuchao ~]#
?實(shí)例二、統(tǒng)計(jì)某個文件夾下的文件占用的大小已M為單位
[root@liuchao ~]# ll | awk 'BEGIN {size=0;} {size=size+$5;} END{print "當(dāng)前文件夾總大小是:"size/1024/1024"M"}'
當(dāng)前文件夾總大小是:0.000195503M
[root@liuchao ~]#
?4、運(yùn)算符
#賦值運(yùn)算符:a+5
[root@liuchao ~]# awk 'BEGIN{a=5;a+=5;print a}'
10#邏輯運(yùn)算符:a>2&&b>1 運(yùn)算結(jié)果 和 a=1||b>1 運(yùn)算結(jié)果
[root@liuchao ~]# awk 'BEGIN{a=1;b=2;print (a>2&&b>1,a=1||b>1)}'
0 1# 正則運(yùn)算符
[root@liuchao ~]# awk 'BEGIN{a="100testaa";if(a~/100/) {print "ok"}}'
ok
[root@liuchao ~]# echo|awk 'BEGIN{a="100testaaa"}a~/test/{print "ok"}'
ok
[root@liuchao ~]## 關(guān)系運(yùn)算符
[root@liuchao ~]# awk 'BEGIN{a=5;if(a>=6){print "true"}}'
[root@liuchao ~]# awk 'BEGIN{a=5;if(a>=5){print "true"}}'
true# 算數(shù)運(yùn)算符 說明,所有用作算術(shù)運(yùn)算符進(jìn)行操作,操作數(shù)自動轉(zhuǎn)為數(shù)值,所有非數(shù)值都變?yōu)?。
[root@liuchao ~]# awk 'BEGIN{a="b";b=3;print ++a,++b}'
1 4
[root@liuchao ~]## 三目運(yùn)算符
[root@liuchao ~]# awk 'BEGIN{a="3";print a=="3"?"true":"false"}'
true
[root@liuchao ~]#
?5、常用內(nèi)置變量?
5.1、字符串分隔符"FS"
# 測試文件內(nèi)容
[root@liuchao awk_test]# cat test1.txt
test ab ac ad
testb fd bd gg
testc ii jj www ab
testd ab ff bb dd
# 在BEGIN 模塊中設(shè)置 分隔符 ' ' , ”+“ 標(biāo)識多個
[root@liuchao awk_test]# awk 'BEGIN{FS="[ ]+"}{print $2}' test1.txt
ab
fd
ii
ab
# 在BEGIN 模塊中設(shè)置 分隔符 ' ' , ”+“ 標(biāo)識多個
[root@liuchao awk_test]# awk 'BEGIN{FS=" +"}{print $2}' test1.txt
ab
fd
ii
ab
# 使用-F 選項(xiàng)設(shè)置分隔符
[root@liuchao awk_test]# awk -F' +' '{print $2}' test1.txt
ab
fd
ii
ab
[root@liuchao awk_test]#
5.2、字符串?dāng)?shù)量?
# 測試文件內(nèi)容
[root@liuchao awk_test]# cat test1.txt
test ab ac ad
testb fd bd gg
testc ii jj www ab
testd ab ff bb dd# 一個或者多個空格分隔后,分隔數(shù)量等于5個 打印 當(dāng)前行記錄
[root@liuchao awk_test]# awk -F ' +' 'NF==5{print $0}' test1.txt
testc ii jj www ab
testd ab ff bb dd
[root@liuchao awk_test]#