自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Linux三劍客之a(chǎn)wk詳解

企業(yè)動態(tài)
awk不僅僅是linux系統(tǒng)中的一個(gè)命令,而且是一種編程語言;它可以用來處理數(shù)據(jù)和生成報(bào)告(excel);處理的數(shù)據(jù)可以是一個(gè)或多個(gè)文件。

***篇 awk簡介與表達(dá)式實(shí)例 

  • 一種名字怪異的語言

  • 模式掃描和處理,處理數(shù)據(jù)和生成報(bào)告。

awk不僅僅是linux系統(tǒng)中的一個(gè)命令,而且是一種編程語言;它可以用來處理數(shù)據(jù)和生成報(bào)告(excel);處理的數(shù)據(jù)可以是一個(gè)或多個(gè)文件;可以是直接來自標(biāo)準(zhǔn)輸入,也可以通過管道獲取標(biāo)準(zhǔn)輸入;awk可以在命令行上直接編輯命令進(jìn)行操作,也可以編寫成awk程序來進(jìn)行更為復(fù)雜的運(yùn)用。

sed處理stream editor文本流,水流。

一、awk環(huán)境簡介

本文涉及的awk為gawk,即GNU版本的awk。

  1. [root@creditease awk]# cat /etc/redhat-release 
  2. CentOS Linux release 7.5.1804 (Core) 
  3. [root@creditease awk]# uname -r 
  4. 3.10.0-862.el7.x86_64 
  5. [root@creditease awk]# ll `which awk` 
  6. lrwxrwxrwx. 1 root root 4 Nov  7 14:47 /usr/bin/awk -> gawk  
  7. [root@creditease awk]# awk --version 
  8. GNU Awk 4.0.2 

二、awk的格式

awk指令是由模式、動作,或者模式和動作的組合組成。

  • 模式即pattern,可以類似理解成sed的模式匹配,可以由表達(dá)式組成,也可以是兩個(gè)正斜杠之間的正則表達(dá)式。比如NR==1,這就是模式,可以把它理解為一個(gè)條件。

  • 動作即action,是由在大括號里面的一條或多條語句組成,語句之間使用分號隔開。如下awk使用格式。

三、記錄和域

名稱 含義
record 記錄,行
filed 域,區(qū)域,字段,列

1)NF(number of field)表示一行中的區(qū)域(列)數(shù)量,$NF取***一個(gè)區(qū)域。

2)$符號表示取某個(gè)列(區(qū)域),$1,$2,$NF

3)NR (number of record) 行號,awk對每一行的記錄號都有一個(gè)內(nèi)置變量NR來保存,每處理完一條記錄NR的值就會自動+1

4)FS(-F)field separator 列分隔符,以什么把行分隔成多列

3.1 指定分隔符

  1. [root@creditease awk]# awk -F "#" '{print $NF}' awk.txt  
  2. GKL$123 
  3. GKL$213 
  4. GKL$321 
  5. [root@creditease awk]# awk -F '[#$]' '{print $NF}' awk.txt  
  6. 123 
  7. 213 
  8. 321 

3.2 條件動作基本的條件和動作

  1. [root@creditease awk]# cat awk.txt  
  2. ABC#DEF#GHI#GKL$123 
  3. BAC#DEF#GHI#GKL$213 
  4. CBA#DEF#GHI#GKL$321 
  5. [root@creditease awk]# awk -F "#" 'NR==1{print $1}' awk.txt 
  6. ABC 

3.3 只有條件

  1. [root@creditease awk]# awk -F "#" 'NR==1' awk.txt 
  2. BC#DEF#GHI#GKL$123 

默認(rèn)會有動作{print $0}

3.4 只有動作

  1. [root@creditease awk]# awk -F "#" '{print $1}' awk.txt 
  2. ABC 
  3. BAC 
  4. CAB 

默認(rèn)處理所有行

3.5 多個(gè)模式和動作

  1. [root@creditease awk]# awk -F "#" 'NR==1{print $NF}NR==3{print $NF}' awk.txt  
  2. GKL$123 
  3. GKL$321 

3.6 對$0的認(rèn)識

awk中$0表示整行

  1. [root@creditease awk]# awk '{print $0}' awk_space.txt 
  2. ABC DEF GHI GKL$123 
  3. BAC DEF GHI GKL$213 
  4. CBA DEF GHI GKL$321 

3.7 FNR

FNR與NR類似,不過多文件記錄不遞增,每個(gè)文件都從1開始(后邊處理多文件會講到)

  1. [root@creditease awk]# awk '{print NR}' awk.txt awk_space.txt  
  2. 1 
  3. 2 
  4. 3 
  5. 4 
  6. 5 
  7. 6 
  8. [root@creditease awk]# awk '{print FNR}' awk.txt awk_space.txt  
  9. 1 
  10. 2 
  11. 3 
  12. 1 
  13. 2 
  14. 3 

四、正則表達(dá)式與操作符

awk同sed一樣也可以通過模式匹配來對輸入的文本進(jìn)行匹配處理。 awk也支持大量的正則表達(dá)式模式,大部分與sed支持的元字符類似,而且正則表達(dá)式是玩轉(zhuǎn)三劍客的必備工具。

awk支持的正則表達(dá)式元字符

awk默認(rèn)不支持的元字符,和需要添加參數(shù)才能支持的元字符

元字符 功能 示例 解釋
x{m} x重復(fù)m次 /cool{5}/ 需要注意一點(diǎn)的是,cool加括號或不加括號的區(qū)別,x可以使字符串也可以只是一個(gè)字符,所以/cool{5}/表示匹配coo再加上5個(gè)l,即coolllll。/(cool){2,}/表示匹配coolcool,coolcoolcool等。
x{m,} x重復(fù)至少m次 /(cool){2,}/ 同上
x{m,n} x重復(fù)至少m次,但不超過n次,需要指定參數(shù):--posix或者--re-interval。沒有該參數(shù)不能使用這種模式 /(cool){5,6}/ 同上

正則表達(dá)式的運(yùn)用,默認(rèn)是在行內(nèi)查找匹配的字符串,若有匹配則執(zhí)行action操作,但是有時(shí)候僅需要固定的列表匹配指定的正則表達(dá)式。

比如:

我想取/etc/passwd文件中第五列($5)這一列查找匹配mail字符串的行,這樣就需要用另外兩個(gè)匹配操作符。并且awk里面只有這兩個(gè)操作符來匹配正則表達(dá)式的。

  正則匹配操作符
~ 用于對記錄或區(qū)域的表達(dá)式進(jìn)行匹配。
!~ 用于表達(dá)與~相反的意思。

4.1 正則實(shí)例

1)顯示awk.txt中GHI列

  1. [root@creditease awk]# cat awk.txt  
  2. ABC#DEF#GHI#GKL$123 
  3. BAC#DEF#GHI#GKL$213 
  4. CBA#DEF#GHI#GKL$321 
  5. [root@creditease awk]# awk -F "#" '{print $3}' awk.txt  
  6. GHI 
  7. GHI 
  8. GHI 
  9. [root@creditease awk]# awk -F "#" '{print $(NF-1)}' awk.txt  
  10. GHI 
  11. GHI 
  12. GHI 

2)顯示包含321的行

  1. [root@creditease awk]# awk '/321/{print $0}' awk.txt  
  2. CBA#DEF#GHI#GKL$321 

3)以#為分隔符,顯示***列以B開頭或***一列以1結(jié)尾的行

  1. [root@creditease awk]# awk -F "#" '$1~/^B/{print $0}$NF~/1$/{print $0}' awk.txt  
  2. BAC#DEF#GHI#GKL$213 
  3. CBA#DEF#GHI#GKL$321 

4)以#為分隔符,顯示***列以B或C開頭的行

  1. [root@creditease awk]# awk -F "#" '$1~/^B|^C/{print $0}' awk.txt  
  2. BAC#DEF#GHI#GKL$213 
  3. CBA#DEF#GHI#GKL$321 
  4. [root@creditease awk]# awk -F "#" '$1~/^[BC]/{print $0}' awk.txt  
  5. BAC#DEF#GHI#GKL$213 
  6. CBA#DEF#GHI#GKL$321 
  7. [root@creditease awk]# awk -F "#" '$1~/^(B|C)/{print $0}' awk.txt  
  8. BAC#DEF#GHI#GKL$213 
  9. CBA#DEF#GHI#GKL$321 
  10. [root@creditease awk]# awk -F "#" '$1!~/^A/{print $0}' awk.txt  
  11. BAC#DEF#GHI#GKL$213 
  12. CBA#DEF#GHI#GKL$321 

五、比較表達(dá)式

awk是一種編程語言,能夠進(jìn)行更為復(fù)雜的判斷,當(dāng)條件為真時(shí),awk就執(zhí)行相關(guān)的action,主要是在針對某一區(qū)域做出相關(guān)的判斷,比如打印成績在80分以上的,這樣就必須對這一個(gè)區(qū)域作比較判斷.

下表列出了awk可以使用的關(guān)系運(yùn)算符,可以用來比較數(shù)字字符串,還有正則表達(dá)式,當(dāng)表達(dá)式為真的時(shí)候,表達(dá)式結(jié)果為1,否則為0,只有表達(dá)式為真,awk才執(zhí)行相關(guān)的action。

awk支持的關(guān)系運(yùn)算符

運(yùn)算符 含義 示例
< 小于 x>y
<= 小于或等于。 x<=y
== 等于 x==y
!= 不等于 x!=y
>= 大于或等于 x>=y
> 大于 x<y

5.1 比較表達(dá)式實(shí)例

顯示awk.txt的第2 ,3 行

NR //,//

  1. [root@creditease awk]# awk 'NR==2{print $0}NR==3{print $0}' awk.txt  
  2. BAC#DEF#GHI#GKL$213 
  3. CBA#DEF#GHI#GKL$321 
  4. [root@creditease awk]# awk 'NR>=1{print $0}' awk.txt  
  5. ABC#DEF#GHI#GKL$123 
  6. BAC#DEF#GHI#GKL$213 
  7. CBA#DEF#GHI#GKL$321 
  8. [root@creditease awk]# awk '/BAC/,/CBA/{print $0}' awk.txt  
  9. BAC#DEF#GHI#GKL$213 
  10. CBA#DEF#GHI#GKL$321 

第二篇 awk模塊、變量與執(zhí)行

完整awk結(jié)構(gòu)圖如下:

一、BEGIN模塊

BEGIN模塊在awk讀取文件之前就執(zhí)行,BEGIN模式常常被用來修改內(nèi)置變量ORS,RS,F(xiàn)S,OFS等的值??梢圆唤尤魏屋斎胛募?/p>

二、awk內(nèi)置變量(預(yù)定義變量)

變量名 屬性
$0 當(dāng)前記錄,一整行
$1,$2,$3....$a 當(dāng)前記錄的第n個(gè)區(qū)域,區(qū)域間由FS分隔。
FS 輸入?yún)^(qū)域分隔符,默認(rèn)是空格。field separator
NF 當(dāng)前記錄中的區(qū)域個(gè)數(shù),就是有多少列。number of field
NR 已經(jīng)讀出的記錄數(shù),就是行號,從1開始。number of record
RS 輸入的記錄分隔符默認(rèn)為換行符。record separator
OFS 輸出區(qū)域分隔符,默認(rèn)也是空格。output record separator
FNR 當(dāng)前文件的讀入記錄號,每個(gè)文件重新計(jì)算。
FILENAME 當(dāng)前正在處理的文件的文件名

特別提示:FS RS支持正則表達(dá)式

2.1 ***個(gè)作用: 定義內(nèi)置變量

  1. [root@creditease awk]# awk 'BEGIN{RS="#"}{print $0}' awk.txt  
  2. ABC 
  3. DEF 
  4. GHI 
  5. GKL$123 
  6. BAC 
  7. DEF 
  8. GHI 
  9. GKL$213 
  10. CBA 
  11. DEF 
  12. GHI 
  13. GKL$321 

2.2 第二個(gè)作用:打印標(biāo)識

  1. [root@creditease awk]# awk 'BEGIN{print "=======start======"}{print $0}' awk.txt  
  2. =======start====== 
  3. ABC#DEF#GHI#GKL$123 
  4. BAC#DEF#GHI#GKL$213 
  5. CBA#DEF#GHI#GKL$321 

2.3 awk實(shí)現(xiàn)計(jì)算功能

  1. [root@creditease files]# awk 'BEGIN{a=8;b=90;print a+b,a-c,a/b,a%b}' 
  2. 8 8 0.0888889 8 

三、END模塊

END在awk讀取完所有的文件的時(shí)候,再執(zhí)行END模塊,一般用來輸出一個(gè)結(jié)果(累加,數(shù)組結(jié)果)。也可以是和BEGIN模塊類似的結(jié)尾標(biāo)識信息。

3.1 ***個(gè)作用:打印標(biāo)識

  1. [root@creditease awk]# awk 'BEGIN{print "=======start======"}{print $0}END{print "=======end======"}' awk.txt 
  2. =======start====== 
  3. ABC#DEF#GHI#GKL$123 
  4. BAC#DEF#GHI#GKL$213 
  5. CBA#DEF#GHI#GKL$321 
  6. =======end====== 

3.2 第二個(gè)作用:累加

1)統(tǒng)計(jì)空行(/etc/services文件)

grep sed awk

  1. [root@creditease awk]# grep "^$" /etc/services  |wc -l 
  2. 17 
  3. [root@creditease awk]# sed -n '/^$/p' /etc/services |wc -l 
  4. 17 
  5. [root@creditease awk]# awk '/^$/' /etc/services |wc -l 
  6. 17 
  7. [root@creditease awk]# awk '/^$/{i=i+1}END{print i}' /etc/services 
  8. 17 

2)算術(shù)題

1+2+3......+100=5050,怎么用awk表示?

  1. [root@creditease awk]# seq 100|awk '{i=i+$0}END{print i}' 
  2. 5050 

四、awk詳解小結(jié)

1、BEGIN和END模塊只能有一個(gè),BEGIN{}BEGIN{}或者END{}END{}都是錯(cuò)誤的。

2、找誰干啥模塊,可以是多個(gè)。

五、awk執(zhí)行過程總結(jié)

awk執(zhí)行過程:

1、命令行的賦值(-F或-V)

2、執(zhí)行BEGIN模式里面的內(nèi)容

3、開始讀取文件

4、判斷條件(模式)是否成立

  • 成立則執(zhí)行對應(yīng)動作里面的內(nèi)容
  • 讀取下一行,循環(huán)判斷
  • 直到讀取到***一個(gè)文件的結(jié)尾

5、***執(zhí)行END模式里面的內(nèi)容

第三篇:awk數(shù)組與語法

一、awk數(shù)組

1.1 數(shù)組結(jié)構(gòu)

people[police]=110

people[doctor]=120

  1. [root@creditease awk]# awk 'BEGIN{word[0]="credit";word[1]="easy";print word[0],word[1]}' 
  2. credit easy 
  3. [root@creditease awk]# awk 'BEGIN{word[0]="credit";word[1]="easy";for(i in word)print word[i]}' 
  4. credit 
  5. easy 

1.2 數(shù)組分類

索 引數(shù)組:以數(shù)字為下標(biāo)
關(guān)聯(lián)數(shù)組:以字符串為下標(biāo)

1.3 awk關(guān)聯(lián)數(shù)組

現(xiàn)有如下文本,格式如下:即左邊是隨機(jī)字母,右邊是隨機(jī)數(shù)字, 即將相同的字母后面的數(shù)字加在一起,按字母的順序輸出

  1. a  1 
  2. b  3 
  3. c  2 
  4. d  7 
  5. b  5 
  6. a  3  
  7. g  2 
  8. f  6 

以$1為下標(biāo),創(chuàng)建數(shù)組a[$1]=a[$1]+$2(a[$1]+=$2)然后配合END和for循環(huán)輸出結(jié)果:

  1. [root@creditease awk]# awk '{a[$1]=a[$1]+$2}END{for(i in a)print i,a[i]}' jia.txt  
  2. 4 
  3. 8 
  4. 2 
  5. 7 
  6. 6 
  7. 2 
  8. 注意:for(i in a) 循環(huán)的順序不是按照文本內(nèi)容的順序來處理的,排序可以在命令后加sort排序 

1.4 awk索引數(shù)組

以數(shù)字為下標(biāo)的數(shù)組 seq生成1-10的數(shù)字,要求只顯示計(jì)數(shù)行

  1. [root@creditease awk]# seq 10|awk '{a[NR]=$0}END{for(i=1;i<=NR;i+=2){print a[i]}}' 
  2. 1 
  3. 3 
  4. 5 
  5. 7 
  6. 9 

seq生成1-10的數(shù)字,要求不顯示文件的后3行

  1. [root@creditease awk]# seq 10|awk '{a[NR]=$0}END{for(i=1;i<=NR-3;i++){print a[i]}}' 
  2. 1 
  3. 2 
  4. 3 
  5. 4 
  6. 5 
  7. 6 
  8. 7 
  9. 解析:改變i的范圍即可,多用于不顯示文件的后幾行

1.5 awk數(shù)組實(shí)戰(zhàn)去重

a++ 和 ++a

  1. [root@creditease awk]# awk 'BEGIN{print a++}' 
  2. 0 
  3. [root@creditease awk]# awk 'BEGIN{print ++a}' 
  4. 1 
  5. [root@creditease awk]# awk 'BEGIN{a=1;b=a++;print a,b}' 
  6. 2 1 
  7. [root@creditease awk]# awk 'BEGIN{a=1;b=++a;print a,b}' 
  8. 2 2 
  9.  
  10. 注: 
  11.  
  12. 都是 b = a+1 
  13.  
  14. b=a++ 先把 a 的值賦予b,然后 a + 1 
  15.  
  16. b=++a 先執(zhí)行a+1,然后把a(bǔ)的值賦予b 

對一下文本進(jìn)行去重處理 針對第二列去重

  1. [root@creditease awk]# cat qc.txt  
  2. 2018/10/20   xiaoli     13373305025 
  3. 2018/10/25   xiaowang   17712215986 
  4. 2018/11/01   xiaoliu    18615517895  
  5. 2018/11/12   xiaoli     13373305025 
  6. 2018/11/19   xiaozhao   15512013263 
  7. 2018/11/26   xiaoliu    18615517895 
  8. 2018/12/01   xiaoma     16965564525 
  9. 2018/12/09   xiaowang   17712215986 
  10. 2018/11/24   xiaozhao   15512013263 
  1. 解法一: 
  2. [root@creditease awk]# awk '!a[$2]++' qc.txt  
  3. 2018/10/20   xiaoli     13373305025 
  4. 2018/10/25   xiaowang   17712215986 
  5. 2018/11/01   xiaoliu    18615517895  
  6. 2018/11/19   xiaozhao   15512013263 
  7. 2018/12/01   xiaoma     16965564525 
  8. 解析: 
  9. !a[$3]++是模式(條件),命令也可寫成awk '! 
  10. a[$3]=a[$3]+1{print $0}' qc.txt 
  11. a[$3]++ ,“++”在后,先取值后加一 
  12. !a[$3]=a[$3]+1:是先取a[$3]的值,比較“!a[$3]”是否符合條件(條件非0),后加1 
  13. 注意:此方法去重后的結(jié)果顯示的是文本開頭開始的所有不重復(fù)的行 
  14. 解法二: 
  15. [root@creditease awk]# awk '++a[$2]==1' qc.txt  
  16. 2018/10/20   xiaoli     13373305025 
  17. 2018/10/25   xiaowang   17712215986 
  18. 2018/11/01   xiaoliu    18615517895  
  19. 2018/11/19   xiaozhao   15512013263 
  20. 2018/12/01   xiaoma     16965564525 
  21. 解析: 
  22. ++a[$3]==1是模式(條件),也可寫成a[$3]=a[$3]+1==1即只有當(dāng)條件(a[$3]+1的結(jié)果)為1的時(shí)候才打印出內(nèi)容 
  23. ++a[$3] ,“++”在前,先加一后取值 
  24. ++a[$3]==1:是先加1,后取a[$3]的值,比較“++a[$3]”是否符合條件(值為1) 
  25. 注意:此方法去重后的結(jié)果顯示的是文本開頭開始的所有不重復(fù)的行 
  26. 解法三: 
  27. [root@creditease awk]# awk '{a[$2]=$0}END{for(i in a){print a[i]}}' qc.txt 
  28. 2018/11/12   xiaoli     13373305025 
  29. 2018/11/26   xiaoliu    18615517895 
  30. 2018/12/01   xiaoma     16965564525 
  31. 2018/12/09   xiaowang   17712215986 
  32. 2018/11/24   xiaozhao   15512013263 
  33.  
  34. 解析: 
  35. 注意此方法去重后的結(jié)果顯示的是文本結(jié)尾開始的所有不重復(fù)的行 

1.6 awk處理多個(gè)文件(數(shù)組、NR、FNR)

使用awk取file.txt的***列和file1.txt的第二列然后重定向到一個(gè)新文件new.txt中

  1. [root@creditease awk]# cat file1.txt  
  2. a b 
  3. c d 
  4. e f 
  5. g h 
  6. i j 
  7. [root@creditease awk]# cat file2.txt  
  8. 1 2 
  9. 3 4 
  10. 5 6 
  11. 7 8 
  12. 9 10 
  13. [root@creditease awk]# awk 'NR==FNR{a[FNR]=$1}NR!=FNR{print a[FNR],$2}' file1.txt file2.txt  
  14. 2 
  15. 4 
  16. 6 
  17. 8 
  18. 10 
  19. 解析:NR==FNR處理的是***個(gè)文件,NR!=FNR處理的是第二個(gè)文件. 
  20. 注意:當(dāng)兩個(gè)文件NR(行數(shù))不同的時(shí)候,需要把行數(shù)多的放前邊. 
  21. 解決方法:把行數(shù)多的文件放前邊,行數(shù)少的文件放后邊. 
  22. 把輸出的結(jié)果放入一個(gè)新文件new.txt中: 
  23. [root@creditease awk]# awk 'NR==FNR{a[FNR]=$1}NR!=FNR{print a[FNR],$2>"new.txt"}' file1.txt file2.txt  
  24. [root@creditease awk]# cat new.txt  
  25. 2 
  26. 4 
  27. 6 
  28. 8 
  29. 10 

1.7 awk分析日志文件,統(tǒng)計(jì)訪問網(wǎng)站的個(gè)數(shù)

  1. [root@creditease awk]# cat url.txt  
  2. http://www.baidu.com 
  3. http://mp4.video.cn 
  4. http://www.qq.com 
  5. http://www.listeneasy.com 
  6. http://mp3.music.com 
  7. http://www.qq.com 
  8. http://www.qq.com 
  9. http://www.listeneasy.com 
  10. http://www.listeneasy.com 
  11. http://mp4.video.cn 
  12. http://mp3.music.com 
  13. http://www.baidu.com 
  14. http://www.baidu.com 
  15. http://www.baidu.com 
  16. http://www.baidu.com 
  17. [root@creditease awk]# awk -F "[/]+" '{h[$2]++}END{for(i in h) print i,h[i]}' url.txt 
  18. www.qq.com 3 
  19. www.baidu.com 5 
  20. mp4.video.cn 2 
  21. mp3.music.com 2 
  22. www.crediteasy.com 3 

二、awk簡單語法

2.1 函數(shù)sub gsub

替換功能

格式:sub(r, s ,目標(biāo)) gsub(r, s ,目標(biāo))

  1. [root@creditease awk]# cat sub.txt  
  2. ABC DEF AHI GKL$123 
  3. BAC DEF AHI GKL$213 
  4. CBA DEF GHI GKL$321 
  5. [root@creditease awk]# awk '{sub(/A/,"a");print $0}' sub.txt  
  6. aBC DEF AHI GKL$123 
  7. BaC DEF AHI GKL$213 
  8. CBa DEF GHI GKL$321 
  9. [root@creditease awk]# awk '{gsub(/A/,"a");print $0}' sub.txt  
  10. aBC DEF aHI GKL$123 
  11. BaC DEF aHI GKL$213 
  12. CBa DEF GHI GKL$321 
  13. 注:sub只會替換行內(nèi)匹配的***次內(nèi)容;相當(dāng)于sed ‘s###’ 
  14.     gsub 會替換行內(nèi)匹配的所有內(nèi)容;相當(dāng)于sed ‘s###g’ 
  15. [root@creditease awk]# awk '{sub(/A/,"a",$1);print $0}' sub.txt  
  16. aBC DEF AHI GKL$123 
  17. BaC DEF AHI GKL$213 
  18. CBa DEF GHI GKL$321 

練習(xí):

  1. 0001|20081223efskjfdj|EREADFASDLKJCV 
  2. 0002|20081208djfksdaa|JDKFJALSDJFsddf 
  3. 0003|20081208efskjfdj|EREADFASDLKJCV 
  4. 0004|20081211djfksdaa1234|JDKFJALSDJFsddf 
  5. '|'為分隔, 現(xiàn)要將第二個(gè)域字母前的數(shù)字去掉,其他地方都不變, 輸出為: 
  6. 0001|efskjfdj|EREADFASDLKJCV 
  7. 0002|djfksdaa|JDKFJALSDJFsddf 
  8. 0003|efskjfdj|EREADFASDLKJCV 
  9. 0004|djfksdaa1234|JDKFJALSDJFsddf 
  10.  
  11. 方法: 
  12. awk -F '|'  'BEGIN{OFS="|"}{sub(/[0-9]+/,"",$2);print $0}' sub_hm.txt 
  13. awk -F '|'  -v OFS="|" '{sub(/[0-9]+/,"",$2);print $0}' sub_hm.txt 

2.2 if和slse的用法

內(nèi)容:

AA

BC

AA

CB

CC

AA

結(jié)果:

AA YES

BC NO YES

AA YES

CB NO YES

CC NO YES

AA YES

  1. 1) [root@creditease awk]# awk '{if($0~/AA/){print $0" YES"}else{print $0" NO YES"}}' ifelse.txt  
  2. AA YES 
  3. BC NO YES 
  4. AA YES 
  5. CB NO YES 
  6. CC NO YES 
  7. AA YES 
  8. 解析:使用ifelse,if $0匹配到AA,則打印$0 "YES",else反之打印$0 " NO YES"。 
  9. 2)[root@creditease awk]# awk '$0~/AA/{print $0" YES"}$0!~/AA/{print $0" NO YES"}' ifelse.txt  
  10. AA YES 
  11. BC NO YES 
  12. AA YES 
  13. CB NO YES 
  14. CC NO YES 
  15. AA YES 
  16. 解析:使用正則匹配,當(dāng)$0匹配AA時(shí),打印出YES,反之,打印出“NO YES” 

2.3 next用法

如上題,用next來實(shí)現(xiàn)

next :跳過它后邊的所有代碼

  1.  [root@creditease awk]# awk '$0~/AA/{print $0" YES";next}{print $0" NO YES"}' ifelse.txt  
  2. AA YES 
  3. BC NO YES 
  4. AA YES 
  5. CB NO YES 
  6. CC NO YES 
  7. AA YES 
  8. 解析: 
  9. {print $0" NO YES"}:此動作是默認(rèn)執(zhí)行的,當(dāng)前邊的$0~/AA/匹配,就會執(zhí)行{print $0" YES";next} 
  10. 因?yàn)閍ction中有next,所以會跳過后邊的action。 
  11. 如果符合$0~/AA/則打印YES ,遇到next后,后邊的動作不執(zhí)行;如果不符合$0~/AA/,會執(zhí)行next后邊的動作; 
  12. next前邊的(模式匹配),后邊的就不執(zhí)行,前邊的不執(zhí)行(模式不匹配),后邊的就執(zhí)行。 

2.4 printf不換行輸出以及next用法

printf :打印后不換行

如下文本,如果 Description:之后為空,將其后一行內(nèi)容并入此行。

  1. Packages: Hello-1 
  2. Owner: me me me me 
  3. Other: who care? 
  4. Description: 
  5. Hello world! 
  6. Other2: don't care 
  7. 想要結(jié)果: 
  8. Packages: Hello-1 
  9. Owner: me me me me 
  10. Other: who care? 
  11. Description: Hello world! 
  12. Origial-Owner: me me me me 
  13. Other2: don't care 
  14. 1)[root@creditease awk]# awk '/^Desc.*:$/{printf $0}!/Desc.*:$/{print $0}' printf.txt  
  15. Packages: Hello-1 
  16. Owner: me me me me 
  17. Other: who care? 
  18. Description:Hello world! 
  19. Other2: don't care 
  20. 解析:使用正則匹配,匹配到'/^Desc.*:$/,就使用printf打?。ú粨Q行),不匹配的打印出整行。 
  21. 2)使用ifelse實(shí)現(xiàn) 
  22. [root@creditease awk]# awk '{if(/Des.*:$/){printf $0}else{print $0}}' printf.txt  
  23. Packages: Hello-1 
  24. Owner: me me me me 
  25. Other: who care? 
  26. Description:Hello world! 
  27. Other2: don't care 
  28. 3)使用next實(shí)現(xiàn) 
  29. [root@creditease awk]# awk '/Desc.*:$/{printf $0;next}{print $0}' printf.txt  
  30. Packages: Hello-1 
  31. Owner: me me me me 
  32. Other: who care? 
  33. Description:Hello world! 
  34. Other2: don't care 
  35. 注:可簡寫成awk '/Desc.*:$/{printf $0;next}1' 
  36. printf.txt  ## 1是pattern(模式),默認(rèn)action(動作)是{print $0

2.5 去重后計(jì)數(shù)按要求重定向到指定文件

文本如下,要求計(jì)算出每項(xiàng)重復(fù)的個(gè)數(shù),然后把重復(fù)次數(shù)大于2的放入gt2.txt文件中,把重復(fù)次數(shù)小于等于2的放入le2.txt文件中

  1. [root@creditease files]# cat qcjs.txt  
  2. aaa 
  3. bbb 
  4. ccc 
  5. aaa 
  6. ddd 
  7. bbb 
  8. rrr 
  9. ttt 
  10. ccc 
  11. eee 
  12. ddd 
  13. rrr 
  14. bbb 
  15. rrr 
  16. bbb 
  17. [root@creditease awk]# awk '{a[$1]++}END{for(i in a){if(a[i]>2){print i,a[i]>"gt2.txt"}else{print i,a[i]>"le2.txt"}}}' qcjs.txt  
  18. [root@creditease awk]# cat gt2.txt  
  19. rrr 3 
  20. bbb 4 
  21. [root@creditease awk]# cat le2.txt  
  22. aaa 2 
  23. ccc 2 
  24. eee 1 
  25. ttt 1 
  26. ddd 2 
  27. 解析:{print },或括號中打印后可直接重定向到一個(gè)新文件,文件名用雙引號引起來。如: {print $1 >"xin.txt"

三、awk需注意事項(xiàng)

a)NR==FNR ##不能寫成NR=FNR(=在awk中是賦值的意思)

b)NR!=FNR ##NR不等于FNR

c){a=1;a[NR]} 這樣會報(bào)錯(cuò):同一條命令中變量和數(shù)組名不能重復(fù) d)printf 輸出的時(shí)候不換行

e){print },或括號中打印后可直接重定向到一個(gè)新文件,文件名用雙引號引起來。如: {print $1 >"xin.txt"}

f)當(dāng)模式(條件)是0的時(shí)候,后邊的動作不執(zhí)行,!0的時(shí)候后邊動作才執(zhí)行。

【本文是51CTO專欄機(jī)構(gòu)宜信技術(shù)學(xué)院的原創(chuàng)文章,微信公眾號“宜信技術(shù)學(xué)院( id: CE_TECH)”】

戳這里,看該作者更多好文

責(zé)任編輯:張燕妮 來源: 宜信技術(shù)學(xué)院
相關(guān)推薦

2021-03-15 07:39:48

LinuxAwk 語言

2021-05-13 10:25:29

Linuxgrep命令

2019-08-20 14:29:45

grepsedawk

2023-10-04 00:20:31

grepLinux

2011-03-28 16:04:44

nagios

2017-07-25 08:53:14

CorrectLinkCCA-SD算法

2009-02-26 18:22:49

桌面虛擬化Linux

2018-05-04 15:18:01

DockerDocker Comp容器

2010-02-04 16:22:21

2024-06-04 00:20:00

Python函數(shù)

2017-10-16 15:04:32

javaAndroidAPT技術(shù)

2009-02-27 09:10:53

Linux操作系統(tǒng)虛擬化三劍客

2014-11-26 10:18:32

Cloud Setupwindows在線打包工具

2011-07-04 09:07:54

2009-03-19 20:52:58

LinuxPHPCMS

2011-08-06 23:58:34

愛普生投影機(jī)

2023-11-25 17:08:47

ChatbotLLAMALangChain

2011-04-11 11:01:03

AndroidHTC蘋果

2025-04-22 09:39:46

Python爬蟲網(wǎng)頁數(shù)據(jù)抓取

2023-09-05 10:04:35

Linux運(yùn)維
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號