精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

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等的值。可以不接任何輸入文件

二、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操作系統虛擬化三劍客

2011-08-06 23:58:34

愛普生投影機

2011-07-04 09:07:54

2011-04-11 11:01:03

AndroidHTC蘋果

2023-11-25 17:08:47

ChatbotLLAMALangChain

2009-03-19 20:52:58

LinuxPHPCMS

2025-04-22 09:39:46

Python爬蟲網頁數據抓取

2014-11-26 10:18:32

Cloud Setupwindows在線打包工具

2023-09-05 10:04:35

Linux運維
點贊
收藏

51CTO技術棧公眾號

超碰国产在线观看| 久久久免费高清视频| 日韩精品视频中文字幕| 亚洲国产综合视频在线观看| 久久国产精品久久| 欧美国产一级片| 欧美日韩理论| 亚洲欧美变态国产另类| 五月天婷婷亚洲| 大香伊人久久| 国产欧美一区二区精品性色超碰| 国产主播喷水一区二区| 国产一级做a爱免费视频| 国产麻豆精品久久| 日韩一级二级三级精品视频| 日韩中文字幕在线视频观看| 欧美日韩视频在线播放| av午夜一区麻豆| 成人高h视频在线| 影音先锋在线国产| 激情综合视频| 久久夜色精品国产亚洲aⅴ| 久久久久亚洲AV成人无码国产| 成人一级视频| 日韩欧美中文在线| 成年人视频网站免费| jizz亚洲| 91天堂素人约啪| 99久久免费国| 国产又黄又大又爽| 日韩专区一卡二卡| 91av在线免费观看视频| 欧美日韩在线观看成人| 日韩精品看片| 亚洲区一区二区| 中文字幕在线永久| 日韩在线网址| 欧美一级二级在线观看| 色婷婷狠狠18| 日韩三区在线| 色综合久久66| 成年人视频观看| 变态调教一区二区三区| 亚洲精品视频自拍| 99热这里只有精品7| 尤物在线视频| 国产精品美女久久久久久2018 | 91av在线免费视频| 欧美久久视频| 欧美大片网站在线观看| 极品颜值美女露脸啪啪| 最新国产精品久久久| 久久黄色av网站| 日本 欧美 国产| 久久国产影院| 日韩在线观看免费高清完整版| 摸摸摸bbb毛毛毛片| 五月激激激综合网色播| 日韩电影中文字幕在线| 亚洲久久久久久| 牛牛精品成人免费视频| 亚洲福利视频免费观看| 玖玖爱在线精品视频| 欧美大胆a级| 日韩精品极品毛片系列视频| 亚洲黄色免费在线观看| 美女毛片一区二区三区四区最新中文字幕亚洲 | 99久久久国产| 日韩一区二区视频| 日本一区二区免费视频| 欧洲亚洲视频| 国产午夜精品一区理论片飘花| 真实乱视频国产免费观看 | 日韩久久免费视频| 亚洲av无码一区二区三区人 | 肉大捧一出免费观看网站在线播放| 精品国产丝袜高跟鞋 | 日本中文字幕免费观看| 中文高清一区| 国产不卡在线观看| 一区二区美女视频| 国产iv一区二区三区| 精品91免费| 国产资源在线看| 国产精品久久久久久久久久免费看| 天天干天天操天天干天天操| 男女在线观看视频| 欧美性xxxx极品hd满灌| 欧美日韩怡红院| 高清国产一区二区三区四区五区| 欧美成人精精品一区二区频| 黑人巨大精品欧美| 亚洲v在线看| 97在线视频一区| 国产精品露脸视频| 国产91丝袜在线播放| 欧美国产综合视频| 99自拍视频在线观看| 精品久久久久久久中文字幕 | 亚洲男女性事视频| 成人在线观看小视频| 国产视频一区欧美| 91性高湖久久久久久久久_久久99| 黄色成人一级片| 国产精品毛片无遮挡高清| 欧美 日韩 国产精品| 成人va天堂| 精品少妇一区二区| 日韩黄色中文字幕| 亚洲伦理一区| 91成人免费视频| av资源种子在线观看| 亚洲最大的成人av| gogogo高清免费观看在线视频| 国内精品偷拍| 欧美xxxx14xxxxx性爽| 日本中文字幕久久| 成人av午夜电影| 中文字幕不卡每日更新1区2区| 欧美aaaaa性bbbbb小妇| 日韩三级在线观看| 少妇高潮惨叫久久久久| 国产视频亚洲| 国产亚洲自拍偷拍| 日本在线观看大片免费视频| 欧美色图片你懂的| 亚欧洲乱码视频| 99热免费精品在线观看| 99久re热视频这里只有精品6| 日本视频不卡| 欧美午夜在线一二页| 噜噜噜在线视频| 亚洲小说欧美另类社区| 91色中文字幕| 激情成人四房播| 欧美日韩精品久久久| 波多野结衣一本| 亚洲专区欧美专区| 激情视频一区二区| 国产粉嫩在线观看| 精品久久久久久久久久久院品网 | 欧美高清成人| 婷婷中文字幕一区三区| 国产免费一区二区三区最新6| 亚洲最新av| 亚洲一区二区三区视频| 男人的天堂在线视频免费观看| 欧美在线观看你懂的| 国产av自拍一区| 日韩电影在线观看一区| 日本免费高清一区二区| 亚洲天堂一区二区| 亚洲性视频网址| 中文字幕免费播放| 国产精品视频你懂的| 亚洲免费看av| 99久久99视频只有精品| 91亚洲一区精品| 在线三级电影| 欧美精品一区二区不卡| 懂色av.com| 久久久久久97三级| 五月婷婷狠狠操| 99久久综合| 成人性教育视频在线观看| 国产视频在线播放| 日韩精品一区二| 日韩人妻无码一区二区三区99| av中文字幕在线不卡| jizzjizzxxxx| 日本午夜一区| 92福利视频午夜1000合集在线观看| 91精品久久久| 亚洲国产精品系列| 波多野结衣黄色| 亚洲婷婷国产精品电影人久久| 国产精品熟女一区二区不卡| 极品少妇一区二区三区| 精品无人区一区二区三区竹菊| 瑟瑟视频在线看| 国产亚洲激情视频在线| 国产又粗又大又爽视频| 亚洲午夜电影网| 九色porny自拍视频| 久久国产精品第一页| 少妇一晚三次一区二区三区| 亚洲aaa级| 国产色婷婷国产综合在线理论片a| a级片国产精品自在拍在线播放| 精品福利一二区| 亚洲高清在线看| 亚洲精品欧美在线| 丰满少妇高潮一区二区| 国产一区二区免费看| 秋霞无码一区二区| 色999日韩| 国产精品日韩一区二区三区 | 在线免费一区三区| 好吊色视频在线观看| 久久综合久久综合亚洲| 日本美女视频一区| 性8sex亚洲区入口| 日本老太婆做爰视频| 蜜桃成人av| 99国产视频| 91精品店在线| 97在线视频观看| 国产丝袜在线| 中文字幕精品久久| 天堂在线中文| 日韩欧美亚洲另类制服综合在线| 精人妻无码一区二区三区| 一区二区三区欧美激情| 少妇太紧太爽又黄又硬又爽小说| 成人黄色av电影| 久久精品国产露脸对白| 久久国产毛片| 水蜜桃色314在线观看| 91精品成人| 午夜精品亚洲一区二区三区嫩草| 欧美激情99| 国产精品久久久久久久久久直播| 日韩国产91| 国产成人在线亚洲欧美| 国产盗摄在线视频网站| 美女999久久久精品视频| 丁香在线视频| 亚洲天堂2020| 色视频在线观看| 亚洲成人黄色在线观看| 国产免费福利视频| 欧美日韩精品系列| 在线免费观看一区二区| 欧美性黄网官网| 国产a∨精品一区二区三区仙踪林| 亚洲精品第一国产综合野| 美女av免费看| 中文字幕乱码一区二区免费| 精品欧美一区二区久久久| 久久综合九色综合欧美98 | 欧美国产精品久久| 老头老太做爰xxx视频| 久久精品一区二区三区不卡牛牛| 亚洲精品视频大全| 久久午夜羞羞影院免费观看| 国产精品无码网站| 972aa.com艺术欧美| 亚洲啪av永久无码精品放毛片 | 日韩乱码人妻无码中文字幕久久| 91小视频在线免费看| 中国极品少妇videossexhd | 亚洲精品一区二区三区影院忠贞| 久久综合久久鬼色| 国产精品天天干| 中文一区二区完整视频在线观看| 高清国产在线观看| 国产精品久久三区| 国产精品成人69xxx免费视频| 中文字幕欧美一| 老女人性淫交视频| 亚洲成人资源网| 永久免费看片在线播放| 欧美午夜激情在线| 亚洲婷婷久久综合| 欧美喷潮久久久xxxxx| 99久久精品无免国产免费| 日韩精品一区国产麻豆| 手机看片福利在线| 国产香蕉一区二区三区在线视频| av电影在线观看一区二区三区| 最好看的2019的中文字幕视频| 久久久久久久久免费视频| 欧美成人免费va影院高清| 九色91在线| 欧美一级大胆视频| 久久久久久一区二区三区四区别墅| 成人在线视频福利| 嗯用力啊快一点好舒服小柔久久| 免费毛片一区二区三区久久久| 日本激情一区| 免费特级黄色片| 丝袜美腿高跟呻吟高潮一区| 一区二区免费av| 不卡一区中文字幕| 中文字幕av久久爽一区| 亚洲欧美一区二区不卡| 国产成人一区二区三区影院在线| 91久久精品国产91性色tv| 国产乱淫av片免费| 日韩精品久久久久久福利| 77777影视视频在线观看| 色综合五月天导航| 自拍偷自拍亚洲精品被多人伦好爽 | 欧美老熟妇一区二区三区| 亚洲成人免费电影| 中文在线字幕免费观| 精品裸体舞一区二区三区| 国产黄色片在线观看| 欧美美女18p| 朝桐光一区二区| 国产精品青青草| 国产国产精品| 欧美日韩一区二区在线免费观看| 国产麻豆精品一区二区| 亚洲做受高潮无遮挡| 亚洲综合丝袜美腿| 中文字幕一区二区久久人妻| 精品国产不卡一区二区三区| 在线观看免费黄色| 欧美性做爰毛片| 亚洲不卡在线| 亚洲一区3d动漫同人无遮挡 | 一区二区三区欧美日韩| 久久久久久久久久一级| 亚洲精品成人av| 在线免费观看的av| 国产欧美欧洲在线观看| 亚瑟一区二区三区四区| 久久这里只有精品18| 韩国精品一区二区| 九九九视频在线观看| 欧美午夜精品久久久久久人妖 | 亚洲天堂av在线免费| free性m.freesex欧美| 96成人在线视频| 天天综合精品| 在线观看国产中文字幕| 国产喂奶挤奶一区二区三区| 国产成人亚洲精品自产在线| 精品国精品国产| 羞羞电影在线观看www| 成人国产精品久久久| 成人情趣视频| 爆乳熟妇一区二区三区霸乳| 91亚洲大成网污www| 精品国产免费观看| 亚洲精品福利资源站| 丰满大乳少妇在线观看网站 | 亚洲区小说区图片区qvod按摩| 免费网站在线观看视频 | 亚洲va码欧洲m码| 91精品精品| 两性午夜免费视频| 中文字幕日韩精品一区| 国产又粗又猛又色又| 在线视频一区二区| 91p九色成人| 亚洲综合欧美日韩| 麻豆91小视频| 免费中文字幕日韩| 欧美一区二区三区在线观看| 成年视频在线观看| 99re6热在线精品视频播放速度| 亚洲精品一二三区区别| 中文字幕一二三区| 一级日本不卡的影视| 亚洲精品成av人片天堂无码 | 国产精品一区在线观看乱码 | 亚洲欧美网站在线观看| 天天操精品视频| 一区二区高清视频在线观看| 亚洲高清在线观看视频| 97国产真实伦对白精彩视频8| 久久99精品国产自在现线| 日韩人妻精品无码一区二区三区| 久久中文娱乐网| 做爰无遮挡三级| 萌白酱国产一区二区| 哺乳一区二区三区中文视频| 黄色一级视频片| 欧美极品aⅴ影院| a网站在线观看| 91tv亚洲精品香蕉国产一区7ujn| 久久爱www成人| 欧美一级特黄aaa| 亚洲大片精品永久免费| 蝌蚪视频在线播放| 成人美女免费网站视频| 欧美特黄视频| 日韩人妻无码一区二区三区| 欧美丰满少妇xxxbbb| 波多野结衣中文在线| 色一情一乱一伦一区二区三区| 国产呦精品一区二区三区网站| 日韩精品在线免费看| 国产一区二区黑人欧美xxxx| 麻豆精品在线| 日本在线视频www| 亚洲人123区| 亚洲av激情无码专区在线播放| 国产精品欧美一区二区| 牛牛国产精品| 好吊视频在线观看| 欧美一区二区三区四区五区| 午夜影院在线播放| 超碰免费在线公开| 91亚洲国产成人精品一区二区三| 国产精品久久久久久69| 欧美亚洲在线播放| 综合久久精品|