成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Linux三劍客之awk詳解

企業動態
awk不僅僅是linux系統中的一個命令,而且是一種編程語言;它可以用來處理數據和生成報告(excel);處理的數據可以是一個或多個文件。

***篇 awk簡介與表達式實例 

  • 一種名字怪異的語言

  • 模式掃描和處理,處理數據和生成報告。

awk不僅僅是linux系統中的一個命令,而且是一種編程語言;它可以用來處理數據和生成報告(excel);處理的數據可以是一個或多個文件;可以是直接來自標準輸入,也可以通過管道獲取標準輸入;awk可以在命令行上直接編輯命令進行操作,也可以編寫成awk程序來進行更為復雜的運用。

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

一、awk環境簡介

本文涉及的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的模式匹配,可以由表達式組成,也可以是兩個正斜杠之間的正則表達式。比如NR==1,這就是模式,可以把它理解為一個條件。

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

三、記錄和域

名稱 含義
record 記錄,行
filed 域,區域,字段,列

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

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

3)NR (number of record) 行號,awk對每一行的記錄號都有一個內置變量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 

默認會有動作{print $0}

3.4 只有動作

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

默認處理所有行

3.5 多個模式和動作

  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的認識

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類似,不過多文件記錄不遞增,每個文件都從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 

四、正則表達式與操作符

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

awk支持的正則表達式元字符

awk默認不支持的元字符,和需要添加參數才能支持的元字符

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

正則表達式的運用,默認是在行內查找匹配的字符串,若有匹配則執行action操作,但是有時候僅需要固定的列表匹配指定的正則表達式。

比如:

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

  正則匹配操作符
~ 用于對記錄或區域的表達式進行匹配。
!~ 用于表達與~相反的意思。

4.1 正則實例

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結尾的行

  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 

五、比較表達式

awk是一種編程語言,能夠進行更為復雜的判斷,當條件為真時,awk就執行相關的action,主要是在針對某一區域做出相關的判斷,比如打印成績在80分以上的,這樣就必須對這一個區域作比較判斷.

下表列出了awk可以使用的關系運算符,可以用來比較數字字符串,還有正則表達式,當表達式為真的時候,表達式結果為1,否則為0,只有表達式為真,awk才執行相關的action。

awk支持的關系運算符

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

5.1 比較表達式實例

顯示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模塊、變量與執行

完整awk結構圖如下:

一、BEGIN模塊

BEGIN模塊在awk讀取文件之前就執行,BEGIN模式常常被用來修改內置變量ORS,RS,FS,OFS等的值??梢圆唤尤魏屋斎胛募?/p>

二、awk內置變量(預定義變量)

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

特別提示:FS RS支持正則表達式

2.1 ***個作用: 定義內置變量

  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 第二個作用:打印標識

  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實現計算功能

  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讀取完所有的文件的時候,再執行END模塊,一般用來輸出一個結果(累加,數組結果)。也可以是和BEGIN模塊類似的結尾標識信息。

3.1 ***個作用:打印標識

  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 第二個作用:累加

1)統計空行(/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)算術題

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

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

四、awk詳解小結

1、BEGIN和END模塊只能有一個,BEGIN{}BEGIN{}或者END{}END{}都是錯誤的。

2、找誰干啥模塊,可以是多個。

五、awk執行過程總結

awk執行過程:

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

2、執行BEGIN模式里面的內容

3、開始讀取文件

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

  • 成立則執行對應動作里面的內容
  • 讀取下一行,循環判斷
  • 直到讀取到***一個文件的結尾

5、***執行END模式里面的內容

第三篇:awk數組與語法

一、awk數組

1.1 數組結構

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 數組分類

索 引數組:以數字為下標
關聯數組:以字符串為下標

1.3 awk關聯數組

現有如下文本,格式如下:即左邊是隨機字母,右邊是隨機數字, 即將相同的字母后面的數字加在一起,按字母的順序輸出

  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為下標,創建數組a[$1]=a[$1]+$2(a[$1]+=$2)然后配合END和for循環輸出結果:

  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) 循環的順序不是按照文本內容的順序來處理的,排序可以在命令后加sort排序 

1.4 awk索引數組

以數字為下標的數組 seq生成1-10的數字,要求只顯示計數行

  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的數字,要求不顯示文件的后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數組實戰去重

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 先執行a+1,然后把a的值賦予b 

對一下文本進行去重處理 針對第二列去重

  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. 注意:此方法去重后的結果顯示的是文本開頭開始的所有不重復的行 
  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即只有當條件(a[$3]+1的結果)為1的時候才打印出內容 
  23. ++a[$3] ,“++”在前,先加一后取值 
  24. ++a[$3]==1:是先加1,后取a[$3]的值,比較“++a[$3]”是否符合條件(值為1) 
  25. 注意:此方法去重后的結果顯示的是文本開頭開始的所有不重復的行 
  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. 注意此方法去重后的結果顯示的是文本結尾開始的所有不重復的行 

1.6 awk處理多個文件(數組、NR、FNR)

使用awk取file.txt的***列和file1.txt的第二列然后重定向到一個新文件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處理的是***個文件,NR!=FNR處理的是第二個文件. 
  20. 注意:當兩個文件NR(行數)不同的時候,需要把行數多的放前邊. 
  21. 解決方法:把行數多的文件放前邊,行數少的文件放后邊. 
  22. 把輸出的結果放入一個新文件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分析日志文件,統計訪問網站的個數

  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 函數sub gsub

替換功能

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

  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只會替換行內匹配的***次內容;相當于sed ‘s###’ 
  14.     gsub 會替換行內匹配的所有內容;相當于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 

練習:

  1. 0001|20081223efskjfdj|EREADFASDLKJCV 
  2. 0002|20081208djfksdaa|JDKFJALSDJFsddf 
  3. 0003|20081208efskjfdj|EREADFASDLKJCV 
  4. 0004|20081211djfksdaa1234|JDKFJALSDJFsddf 
  5. '|'為分隔, 現要將第二個域字母前的數字去掉,其他地方都不變, 輸出為: 
  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的用法

內容:

AA

BC

AA

CB

CC

AA

結果:

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. 解析:使用ifelseif $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. 解析:使用正則匹配,當$0匹配AA時,打印出YES,反之,打印出“NO YES” 

2.3 next用法

如上題,用next來實現

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"}:此動作是默認執行的,當前邊的$0~/AA/匹配,就會執行{print $0" YES";next} 
  10. 因為action中有next,所以會跳過后邊的action。 
  11. 如果符合$0~/AA/則打印YES ,遇到next后,后邊的動作不執行;如果不符合$0~/AA/,會執行next后邊的動作; 
  12. next前邊的(模式匹配),后邊的就不執行,前邊的不執行(模式不匹配),后邊的就執行。 

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

printf :打印后不換行

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

  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. 想要結果: 
  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打印(不換行),不匹配的打印出整行。 
  21. 2)使用ifelse實現 
  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實現 
  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(模式),默認action(動作)是{print $0

2.5 去重后計數按要求重定向到指定文件

文本如下,要求計算出每項重復的個數,然后把重復次數大于2的放入gt2.txt文件中,把重復次數小于等于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 },或括號中打印后可直接重定向到一個新文件,文件名用雙引號引起來。如: {print $1 >"xin.txt"

三、awk需注意事項

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

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

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

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

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

【本文是51CTO專欄機構宜信技術學院的原創文章,微信公眾號“宜信技術學院( id: CE_TECH)”】

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

責任編輯:張燕妮 來源: 宜信技術學院
相關推薦

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函數

2017-10-16 15:04:32

javaAndroidAPT技術

2009-02-27 09:10:53

Linux操作系統虛擬化三劍客

2014-11-26 10:18:32

Cloud Setupwindows在線打包工具

2009-03-19 20:52:58

LinuxPHPCMS

2011-04-11 11:01:03

AndroidHTC蘋果

2011-08-06 23:58:34

愛普生投影機

2011-07-04 09:07:54

2023-11-25 17:08:47

ChatbotLLAMALangChain

2025-04-22 09:39:46

Python爬蟲網頁數據抓取

2023-09-05 10:04:35

Linux運維
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 97日日碰人人模人人澡分享吧 | 美国十次成人欧美色导视频 | 亚洲 欧美 日韩在线 | 天天艹日日干 | 久久91 | 成人精品鲁一区一区二区 | 亚洲一区二区中文字幕在线观看 | 国产精品一区二区日韩 | 成人久久久| 亚洲免费毛片 | 天天插天天狠天天透 | 91免费观看| 欧美视频一区二区三区 | 亚洲人成人一区二区在线观看 | 精品99久久 | 操人网站 | 国产精品视频观看 | 秋霞性生活| 亚洲一区精品在线 | 精品久久久久久久久久 | 天天射夜夜操 | 欧美精品久久久久久久久老牛影院 | 亚洲精品乱码久久久久久9色 | 中文字幕视频在线免费 | 亚洲精品一区二区三区蜜桃久 | 国产精品欧美一区喷水 | 久久噜噜噜精品国产亚洲综合 | 天堂亚洲| 国产精品乱码一区二区三区 | 久草资源在线 | 国产亚洲日本精品 | 一区二区三区在线 | 日韩国产欧美一区 | 黄色一级毛片 | www.久草.com| 国产精品久久久亚洲 | 久草免费视 | 国产综合网站 | 欧美日韩亚洲国产综合 | 日韩精品一区二区三区视频播放 | 欧美日韩在线精品 |