精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

久草免费新视频| 手机精品视频在线| yourporn在线观看中文站| 日韩激情av在线| 日韩中文字幕国产| 国产人妖在线观看| 亚洲天堂电影| ...av二区三区久久精品| www.av一区视频| 男人天堂2024| 五月天久久777| 亚洲国产天堂久久综合网| 我看黄色一级片| 性爱视频在线播放| 国产日韩欧美不卡在线| 51国产成人精品午夜福中文下载| 国产午夜福利一区二区| 成人黄色av| 亚洲国产精品va在线看黑人动漫| 九色porny91| 日日夜夜天天综合入口| 国产日韩精品一区二区三区在线| 亚洲自拍偷拍色片视频| 波多野结衣大片| 1024日韩| 久久深夜福利免费观看| 亚洲精品视频久久久| 日韩中文字幕视频网| 色屁屁一区二区| 国内精品视频一区二区三区| 在线看黄色av| 久久品道一品道久久精品| 亚洲xxx自由成熟| 亚洲高清视频免费观看| 亚洲青色在线| 免费不卡在线观看av| 久久婷婷五月综合| 欧美精品密入口播放| 欧美成人伊人久久综合网| 国产精品人人爽人人爽| 亚洲国产福利| 无吗不卡中文字幕| 欧美a级免费视频| 免费黄色在线| 国产精品美女视频| 日韩在线国产| 免费播放片a高清在线观看| 成人黄色在线看| 成人动漫在线观看视频| 99精品视频免费看| 国产一区欧美日韩| 国产一区二区丝袜| 亚洲性猛交富婆| 日韩国产欧美在线观看| 日本人成精品视频在线| 免费av网站在线| 国产精品乱看| 欧美一区二区三区…… | 欧美黑人做爰爽爽爽| 欧美一区二区久久| 麻豆网站免费观看| 一区二区三区视频免费视频观看网站| 337p亚洲精品色噜噜狠狠| 天天干天天操天天做| 欧美一区二区三区婷婷| 欧美人狂配大交3d怪物一区| 免费成年人高清视频| 国产在线一区不卡| 欧美大胆人体bbbb| 亚洲调教欧美在线| 国产一区二区亚洲| 中文字幕精品一区久久久久| 天海翼在线视频| 综合日韩在线| 国模精品视频一区二区| 特黄视频免费看| 日韩av中文字幕一区二区三区| 国产精品免费小视频| 国产日韩免费视频| 成人午夜激情视频| 欧美12av| 日本成人在线播放| 亚洲欧美偷拍另类a∨色屁股| a天堂资源在线观看| 国产精品xx| 欧洲一区在线电影| 97免费公开视频| 日韩极品在线| 日日摸夜夜添一区| 久久久综合久久久| 老司机午夜精品视频| 国产日韩一区在线| 你懂的网站在线| 国产亚洲精品资源在线26u| 先锋在线资源一区二区三区| 最新日本在线观看| 欧美日韩中文字幕在线视频| 一个色综合久久| 精品中国亚洲| 久久精品国产96久久久香蕉| 久久免费播放视频| 日韩成人免费电影| 国产精品久久久久久久天堂第1集 国产精品久久久久久久免费大片 国产精品久久久久久久久婷婷 | 中文字幕免费观看| 久久99国产精品成人| 国产区一区二区三区| 成人免费一区二区三区视频网站| 亚洲免费视频中文字幕| av免费中文字幕| 最新国产一区二区| 国产一区二区三区在线视频| 免费无码毛片一区二区app| 天堂va蜜桃一区二区三区漫画版 | 一本色道久久综合亚洲| av网站免费线看精品| 亚洲午夜精品福利| 欧美男男tv网站在线播放| 56国语精品自产拍在线观看| 精品无码一区二区三区| 黄色日韩精品| 国产日本欧美视频| 九色在线免费| 午夜精品福利一区二区三区av | 国产激情视频一区二区在线观看| 日本一区二区免费看| 第一av在线| 69精品人人人人| 蜜桃无码一区二区三区| 99国产精品| 97人人模人人爽视频一区二区| 福利视频在线导航| 欧美性生交大片免费| 欧美日韩人妻精品一区在线| 一本一道久久a久久精品蜜桃| 国产成人精品一区二区三区| 欧美日本网站| 午夜精品久久久| 国产免费一区二区三区最新6| 自拍偷拍欧美专区| 91精品久久久久久久久久久久久| 国产中文字幕在线观看| 色婷婷av一区二区三区大白胸| 日本一级片在线播放| 激情综合亚洲| 福利视频一区二区三区| 污视频免费在线观看| 欧美一级免费观看| www色aa色aawww| 精品一区二区三区免费| 手机福利在线视频| 亚洲黑人在线| 久久天天躁狠狠躁夜夜躁| 国产精品久久777777换脸| 亚洲日本一区二区三区| 精品国产鲁一鲁一区二区三区| 国产精品久久久久一区二区三区厕所| 国产日本欧美一区二区三区| 日本成人网址| 日韩视频不卡中文| 精品在线免费观看视频| www.爱久久.com| 中文字幕无码精品亚洲35| 欧美变态挠脚心| 日本久久中文字幕| 九色视频在线观看免费播放| 欧美系列在线观看| 国产在线免费看| 国产一区二区看久久| 国产成人永久免费视频| 你懂的在线观看一区二区| 亲子乱一区二区三区电影| 国产黄色片在线观看| 欧美人成免费网站| 久久久精品视频在线| 91在线视频免费观看| 国产三级三级三级看三级| 欧美激情欧美| 国产精品视频入口| 经典三级一区二区| 伦理中文字幕亚洲| 神马午夜电影一区二区三区在线观看| 欧美午夜xxx| 久久99久久99精品免费看小说| 国产精品中文字幕日韩精品| 777av视频| 红桃成人av在线播放| 91日韩在线播放| 公肉吊粗大爽色翁浪妇视频| 日韩精品久久久久久久软件91| 欧美激情精品久久久久久蜜臀| 天堂av在线7| 欧美日本在线一区| 亚洲精品视频在线观看免费视频| 91在线播放网址| 欧美女同在线观看| 爱情岛论坛亚洲品质自拍视频网站 | 欧美激情亚洲一区| 九色国产在线观看| 欧美一区二区三区精品| 黄瓜视频在线免费观看| 亚洲视频在线观看一区| 一本加勒比波多野结衣| 日本91福利区| heyzo亚洲| 欧美第十八页| 精品一区二区三区自拍图片区| 日韩精选视频| 久久久影视精品| 色开心亚洲综合| 日韩激情第一页| 精品人妻一区二区三区四区不卡| 岛国av一区二区三区| 北条麻妃在线观看视频| 91在线观看视频| 另类小说色综合| 亚洲免费大片| 在线视频一区观看| 亚洲精华一区二区三区| 国产精品一区=区| 91禁在线看| 欧美成人午夜激情在线| 国产三区四区在线观看| 日韩免费一区二区| 在线观看视频中文字幕| 欧美日韩亚洲天堂| 国产对白videos麻豆高潮| 欧美国产乱子伦 | 黑森林福利视频导航| 911精品美国片911久久久| 国产一区国产精品| 午夜视频一区二区在线观看| 国产日韩换脸av一区在线观看| 在线手机中文字幕| 午夜欧美不卡精品aaaaa| 免费在线看黄网站| 日韩在线高清视频| 瑟瑟视频在线| 最好看的2019的中文字幕视频| 伊人久久一区二区三区| 国内精品国产成人国产三级粉色| 国产在线一区二区三区| 91tv亚洲精品香蕉国产一区| 欧美中文在线视频| 345成人影院| 欧美亚洲另类在线| 日本黄色免费在线| 欧美在线视频网站| 日韩电影免费观| 日本一区二区不卡| 欧美暴力调教| 国产精品视频不卡| 一区二区三区日本视频| 91精品国产自产在线观看永久| 成人精品国产| 成人黄色影片在线| 国产一区二区三区免费在线 | 91成人午夜| 国产一级二级三级精品| 青青视频一区二区| 免费日韩av电影| 欧美一级精品| 国产又大又长又粗又黄| 综合激情网站| 欧美中文字幕在线观看视频| 亚洲青涩在线| 色婷婷综合久久久久中文字幕 | 国产极品精品在线观看| 国产综合色区在线观看| 国产精品丝袜久久久久久高清 | 精品日韩欧美| 亚洲精品456| 亚洲一区二区三区免费看| 国产精品99一区二区三| 成人av在线播放观看| 亚洲专区一区| 可以看污的网站| 成人成人成人在线视频| 一级做a爰片毛片| 国产精品美女久久久久高潮| 超碰手机在线观看| 午夜影院久久久| 日韩中文字幕高清| 91精品国产综合久久精品性色| 欧美 日韩 国产 成人 在线 91| 精品视频在线播放免| 91在线看片| 九色91av视频| 午夜影院在线播放| 成人a免费视频| 久久久精品国产**网站| 亚洲精品高清国产一线久久| 午夜精品国产| youjizzxxxx18| 成人免费视频一区| 美国一级黄色录像| 亚洲福利视频导航| 中文字幕人妻一区二区三区视频| 日韩一区二区三区免费观看| 日本高清视频免费看| 亚洲一区二区久久久| 成人三级黄色免费网站| 欧美成人激情在线| 日本黄色免费在线| 69174成人网| 国产精品一区二区av日韩在线| 日本三日本三级少妇三级66| 国产深夜精品| 51自拍视频在线观看| 久久久久久久一区| 日本污视频在线观看| 欧美区一区二区三区| 欧美巨乳在线| 久久久久久久久久久久久久久久久久av | 最新不卡av在线| 天天插天天操天天干| 91精品国产高清一区二区三区蜜臀 | 97在线观看免费高| 狠狠躁夜夜躁久久躁别揉| 国产欧美久久久| 亚洲人在线视频| 国产黄色大片在线观看| 91精品久久久久久久久久另类| 乱亲女h秽乱长久久久| 免费成人进口网站| 男女性色大片免费观看一区二区| 男男做爰猛烈叫床爽爽小说| 亚洲激情六月丁香| 一级片视频网站| 亚洲香蕉伊综合在人在线视看| 九色porny丨首页入口在线| 99高清视频有精品视频| 一区二区三区四区电影| 午夜免费看毛片| 国产亚洲污的网站| 精品免费囯产一区二区三区| 精品国产免费一区二区三区四区| jizz性欧美| 亚洲va码欧洲m码| 91精品婷婷色在线观看| 99热一区二区| 中文字幕一区视频| 欧美超碰在线观看| 亚洲精品综合精品自拍| 周于希免费高清在线观看| 激情小说综合区| 99精品免费视频| 黄色性生活一级片| 韩曰欧美视频免费观看| 日韩一级片免费| 97热精品视频官网| 三级精品视频| 无码少妇一区二区三区芒果| 国产亚洲精品aa午夜观看| 久久精品久久久久久久| 亚洲视频在线观看免费| 亚洲精品一区三区三区在线观看| 日韩精品一区二区三区外面 | 亚洲自拍偷拍精品| 午夜精品福利一区二区蜜股av | 国产aaa免费视频| 国产成人免费视频网站| 免费人成在线观看| 精品88久久久久88久久久| 99在线视频影院| 久久精品一二三区| 国产亚洲成人一区| 亚洲a v网站| 在线成人免费视频| 国模私拍视频在线播放| 狠狠爱一区二区三区| 久久精品首页| www.4hu95.com四虎| 欧美一区二区视频在线观看2022| 在线观看中文| 国产综合 伊人色| 久久一区中文字幕| 永久免费未视频| 欧美成人性战久久| 涩涩涩在线视频| 亚洲欧洲日韩综合二区| 国内一区二区视频| 精品肉丝脚一区二区三区| 日韩高清av一区二区三区| 播放一区二区| 欧美在线观看黄| 91丝袜呻吟高潮美腿白嫩在线观看| 91精品国产高清一区二区三密臀| 中文字幕亚洲欧美在线| 久久久91麻豆精品国产一区| 免费观看美女裸体网站| 国产精品久久久一本精品| 国产av一区二区三区| 欧美最猛性xxxxx亚洲精品| 欧美高清视频在线观看mv| 无码人妻精品一区二区三区99不卡| 色婷婷综合久久久久中文| а√中文在线8| 欧美极品一区二区| 国产成人福利片| 五月激情丁香网|